mirror of
https://gitlab.com/famedly/fluffychat.git
synced 2024-11-24 04:59:26 +01:00
refactor: Switch to flutter_lints
This commit is contained in:
parent
d775174e97
commit
44ce92e8fb
@ -1,4 +1,4 @@
|
|||||||
include: package:pedantic/analysis_options.yaml
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
linter:
|
linter:
|
||||||
rules:
|
rules:
|
||||||
|
@ -45,52 +45,52 @@ class AppRoutes {
|
|||||||
List<VRouteElement> get _mobileRoutes => [
|
List<VRouteElement> get _mobileRoutes => [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/rooms',
|
path: '/rooms',
|
||||||
widget: ChatList(),
|
widget: const ChatList(),
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/spaces/:roomid',
|
path: '/spaces/:roomid',
|
||||||
widget: ChatDetails(),
|
widget: const ChatDetails(),
|
||||||
stackedRoutes: _chatDetailsRoutes,
|
stackedRoutes: _chatDetailsRoutes,
|
||||||
),
|
),
|
||||||
VWidget(path: ':roomid', widget: Chat(), stackedRoutes: [
|
VWidget(path: ':roomid', widget: const Chat(), stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'encryption',
|
path: 'encryption',
|
||||||
widget: ChatEncryptionSettings(),
|
widget: const ChatEncryptionSettings(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'invite',
|
path: 'invite',
|
||||||
widget: InvitationSelection(),
|
widget: const InvitationSelection(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'details',
|
path: 'details',
|
||||||
widget: ChatDetails(),
|
widget: const ChatDetails(),
|
||||||
stackedRoutes: _chatDetailsRoutes,
|
stackedRoutes: _chatDetailsRoutes,
|
||||||
),
|
),
|
||||||
]),
|
]),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/settings',
|
path: '/settings',
|
||||||
widget: Settings(),
|
widget: const Settings(),
|
||||||
stackedRoutes: _settingsRoutes,
|
stackedRoutes: _settingsRoutes,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/search',
|
path: '/search',
|
||||||
widget: Search(),
|
widget: const Search(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/archive',
|
path: '/archive',
|
||||||
widget: Archive(),
|
widget: const Archive(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newprivatechat',
|
path: '/newprivatechat',
|
||||||
widget: NewPrivateChat(),
|
widget: const NewPrivateChat(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newgroup',
|
path: '/newgroup',
|
||||||
widget: NewGroup(),
|
widget: const NewGroup(),
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newspace',
|
path: '/newspace',
|
||||||
widget: NewSpace(),
|
widget: const NewSpace(),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -99,64 +99,64 @@ class AppRoutes {
|
|||||||
VNester(
|
VNester(
|
||||||
path: '/rooms',
|
path: '/rooms',
|
||||||
widgetBuilder: (child) => TwoColumnLayout(
|
widgetBuilder: (child) => TwoColumnLayout(
|
||||||
mainView: ChatList(),
|
mainView: const ChatList(),
|
||||||
sideView: child,
|
sideView: child,
|
||||||
),
|
),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
nestedRoutes: [
|
nestedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '',
|
path: '',
|
||||||
widget: EmptyPage(),
|
widget: const EmptyPage(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/spaces/:roomid',
|
path: '/spaces/:roomid',
|
||||||
widget: ChatDetails(),
|
widget: const ChatDetails(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
stackedRoutes: _chatDetailsRoutes,
|
stackedRoutes: _chatDetailsRoutes,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newprivatechat',
|
path: '/newprivatechat',
|
||||||
widget: NewPrivateChat(),
|
widget: const NewPrivateChat(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newgroup',
|
path: '/newgroup',
|
||||||
widget: NewGroup(),
|
widget: const NewGroup(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/newspace',
|
path: '/newspace',
|
||||||
widget: NewSpace(),
|
widget: const NewSpace(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VNester(
|
VNester(
|
||||||
path: ':roomid',
|
path: ':roomid',
|
||||||
widgetBuilder: (child) => SideViewLayout(
|
widgetBuilder: (child) => SideViewLayout(
|
||||||
mainView: Chat(),
|
mainView: const Chat(),
|
||||||
sideView: child,
|
sideView: child,
|
||||||
),
|
),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
nestedRoutes: [
|
nestedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '',
|
path: '',
|
||||||
widget: Chat(),
|
widget: const Chat(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'encryption',
|
path: 'encryption',
|
||||||
widget: ChatEncryptionSettings(),
|
widget: const ChatEncryptionSettings(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'details',
|
path: 'details',
|
||||||
widget: ChatDetails(),
|
widget: const ChatDetails(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
stackedRoutes: _chatDetailsRoutes,
|
stackedRoutes: _chatDetailsRoutes,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'invite',
|
path: 'invite',
|
||||||
widget: InvitationSelection(),
|
widget: const InvitationSelection(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -167,7 +167,7 @@ class AppRoutes {
|
|||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/rooms',
|
path: '/rooms',
|
||||||
widget: TwoColumnLayout(
|
widget: const TwoColumnLayout(
|
||||||
mainView: ChatList(),
|
mainView: ChatList(),
|
||||||
sideView: EmptyPage(),
|
sideView: EmptyPage(),
|
||||||
),
|
),
|
||||||
@ -176,14 +176,14 @@ class AppRoutes {
|
|||||||
VNester(
|
VNester(
|
||||||
path: '/settings',
|
path: '/settings',
|
||||||
widgetBuilder: (child) => TwoColumnLayout(
|
widgetBuilder: (child) => TwoColumnLayout(
|
||||||
mainView: Settings(),
|
mainView: const Settings(),
|
||||||
sideView: child,
|
sideView: child,
|
||||||
),
|
),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
nestedRoutes: [
|
nestedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '',
|
path: '',
|
||||||
widget: EmptyPage(),
|
widget: const EmptyPage(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
stackedRoutes: _settingsRoutes,
|
stackedRoutes: _settingsRoutes,
|
||||||
),
|
),
|
||||||
@ -191,7 +191,7 @@ class AppRoutes {
|
|||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/search',
|
path: '/search',
|
||||||
widget: TwoColumnLayout(
|
widget: const TwoColumnLayout(
|
||||||
mainView: Search(),
|
mainView: Search(),
|
||||||
sideView: EmptyPage(),
|
sideView: EmptyPage(),
|
||||||
),
|
),
|
||||||
@ -199,7 +199,7 @@ class AppRoutes {
|
|||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/archive',
|
path: '/archive',
|
||||||
widget: TwoColumnLayout(
|
widget: const TwoColumnLayout(
|
||||||
mainView: Archive(),
|
mainView: Archive(),
|
||||||
sideView: EmptyPage(),
|
sideView: EmptyPage(),
|
||||||
),
|
),
|
||||||
@ -210,25 +210,25 @@ class AppRoutes {
|
|||||||
];
|
];
|
||||||
|
|
||||||
List<VRouteElement> get _homeRoutes => [
|
List<VRouteElement> get _homeRoutes => [
|
||||||
VWidget(path: '/', widget: LoadingView()),
|
VWidget(path: '/', widget: const LoadingView()),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '/home',
|
path: '/home',
|
||||||
widget: HomeserverPicker(),
|
widget: const HomeserverPicker(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'login',
|
path: 'login',
|
||||||
widget: Login(),
|
widget: const Login(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'signup',
|
path: 'signup',
|
||||||
widget: SignupPage(),
|
widget: const SignupPage(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'logs',
|
path: 'logs',
|
||||||
widget: LogViewer(),
|
widget: const LogViewer(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -238,27 +238,27 @@ class AppRoutes {
|
|||||||
List<VRouteElement> get _chatDetailsRoutes => [
|
List<VRouteElement> get _chatDetailsRoutes => [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'permissions',
|
path: 'permissions',
|
||||||
widget: ChatPermissionsSettings(),
|
widget: const ChatPermissionsSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'invite',
|
path: 'invite',
|
||||||
widget: InvitationSelection(),
|
widget: const InvitationSelection(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'multiple_emotes',
|
path: 'multiple_emotes',
|
||||||
widget: MultipleEmotesSettings(),
|
widget: const MultipleEmotesSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'emotes',
|
path: 'emotes',
|
||||||
widget: EmotesSettings(),
|
widget: const EmotesSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'emotes/:state_key',
|
path: 'emotes/:state_key',
|
||||||
widget: EmotesSettings(),
|
widget: const EmotesSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
@ -266,49 +266,49 @@ class AppRoutes {
|
|||||||
List<VRouteElement> get _settingsRoutes => [
|
List<VRouteElement> get _settingsRoutes => [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'notifications',
|
path: 'notifications',
|
||||||
widget: SettingsNotifications(),
|
widget: const SettingsNotifications(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'chat',
|
path: 'chat',
|
||||||
widget: SettingsChat(),
|
widget: const SettingsChat(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'emotes',
|
path: 'emotes',
|
||||||
widget: EmotesSettings(),
|
widget: const EmotesSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'style',
|
path: 'style',
|
||||||
widget: SettingsStyle(),
|
widget: const SettingsStyle(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'account',
|
path: 'account',
|
||||||
widget: SettingsAccount(),
|
widget: const SettingsAccount(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'devices',
|
path: 'devices',
|
||||||
widget: DevicesSettings(),
|
widget: const DevicesSettings(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'add',
|
path: 'add',
|
||||||
widget: HomeserverPicker(),
|
widget: const HomeserverPicker(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'login',
|
path: 'login',
|
||||||
widget: Login(),
|
widget: const Login(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'signup',
|
path: 'signup',
|
||||||
widget: SignupPage(),
|
widget: const SignupPage(),
|
||||||
buildTransition: _fadeTransition,
|
buildTransition: _fadeTransition,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -317,31 +317,31 @@ class AppRoutes {
|
|||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'security',
|
path: 'security',
|
||||||
widget: SettingsSecurity(),
|
widget: const SettingsSecurity(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
stackedRoutes: [
|
stackedRoutes: [
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'ignorelist',
|
path: 'ignorelist',
|
||||||
widget: SettingsIgnoreList(),
|
widget: const SettingsIgnoreList(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: '3pid',
|
path: '3pid',
|
||||||
widget: Settings3Pid(),
|
widget: const Settings3Pid(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
VWidget(
|
VWidget(
|
||||||
path: 'logs',
|
path: 'logs',
|
||||||
widget: LogViewer(),
|
widget: const LogViewer(),
|
||||||
buildTransition: _dynamicTransition,
|
buildTransition: _dynamicTransition,
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
|
|
||||||
final _fadeTransition = (animation1, _, child) =>
|
|
||||||
FadeTransition(opacity: animation1, child: child);
|
|
||||||
|
|
||||||
FadeTransition Function(dynamic, dynamic, dynamic) get _dynamicTransition =>
|
FadeTransition Function(dynamic, dynamic, dynamic) get _dynamicTransition =>
|
||||||
columnMode ? _fadeTransition : null;
|
columnMode ? _fadeTransition : null;
|
||||||
|
|
||||||
|
FadeTransition _fadeTransition(animation1, _, child) =>
|
||||||
|
FadeTransition(opacity: animation1, child: child);
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,8 @@ abstract class FluffyThemes {
|
|||||||
static const fallbackTextStyle =
|
static const fallbackTextStyle =
|
||||||
TextStyle(fontFamily: 'Roboto', fontFamilyFallback: ['NotoEmoji']);
|
TextStyle(fontFamily: 'Roboto', fontFamilyFallback: ['NotoEmoji']);
|
||||||
|
|
||||||
static var fallback_text_theme = PlatformInfos.isDesktop
|
static var fallbackTextTheme = PlatformInfos.isDesktop
|
||||||
? TextTheme(
|
? const TextTheme(
|
||||||
bodyText1: fallbackTextStyle,
|
bodyText1: fallbackTextStyle,
|
||||||
bodyText2: fallbackTextStyle,
|
bodyText2: fallbackTextStyle,
|
||||||
button: fallbackTextStyle,
|
button: fallbackTextStyle,
|
||||||
@ -29,12 +29,12 @@ abstract class FluffyThemes {
|
|||||||
headline6: fallbackTextStyle,
|
headline6: fallbackTextStyle,
|
||||||
subtitle1: fallbackTextStyle,
|
subtitle1: fallbackTextStyle,
|
||||||
subtitle2: fallbackTextStyle)
|
subtitle2: fallbackTextStyle)
|
||||||
: TextTheme();
|
: const TextTheme();
|
||||||
|
|
||||||
static ThemeData light = ThemeData(
|
static ThemeData light = ThemeData(
|
||||||
visualDensity: VisualDensity.standard,
|
visualDensity: VisualDensity.standard,
|
||||||
primaryColorDark: Colors.white,
|
primaryColorDark: Colors.white,
|
||||||
primaryColorLight: Color(0xff121212),
|
primaryColorLight: const Color(0xff121212),
|
||||||
brightness: Brightness.light,
|
brightness: Brightness.light,
|
||||||
primaryColor: AppConfig.primaryColor,
|
primaryColor: AppConfig.primaryColor,
|
||||||
colorScheme: ThemeData.light().colorScheme.copyWith(
|
colorScheme: ThemeData.light().colorScheme.copyWith(
|
||||||
@ -43,11 +43,11 @@ abstract class FluffyThemes {
|
|||||||
secondaryVariant: AppConfig.secondaryColor,
|
secondaryVariant: AppConfig.secondaryColor,
|
||||||
),
|
),
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
secondaryHeaderColor: Color(0xffeeeffe),
|
secondaryHeaderColor: const Color(0xffeeeffe),
|
||||||
scaffoldBackgroundColor: Colors.white,
|
scaffoldBackgroundColor: Colors.white,
|
||||||
textTheme: Typography.material2018().black.merge(fallback_text_theme),
|
textTheme: Typography.material2018().black.merge(fallbackTextTheme),
|
||||||
snackBarTheme: SnackBarThemeData(behavior: SnackBarBehavior.floating),
|
snackBarTheme: const SnackBarThemeData(behavior: SnackBarBehavior.floating),
|
||||||
pageTransitionsTheme: PageTransitionsTheme(
|
pageTransitionsTheme: const PageTransitionsTheme(
|
||||||
builders: {
|
builders: {
|
||||||
TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(),
|
TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(),
|
||||||
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
||||||
@ -75,7 +75,7 @@ abstract class FluffyThemes {
|
|||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
floatingActionButtonTheme: FloatingActionButtonThemeData(
|
floatingActionButtonTheme: const FloatingActionButtonThemeData(
|
||||||
backgroundColor: AppConfig.primaryColor,
|
backgroundColor: AppConfig.primaryColor,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
@ -86,7 +86,7 @@ abstract class FluffyThemes {
|
|||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||||
),
|
),
|
||||||
padding: EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
cardTheme: CardTheme(
|
cardTheme: CardTheme(
|
||||||
@ -108,7 +108,7 @@ abstract class FluffyThemes {
|
|||||||
filled: true,
|
filled: true,
|
||||||
fillColor: lighten(AppConfig.primaryColor, .51),
|
fillColor: lighten(AppConfig.primaryColor, .51),
|
||||||
),
|
),
|
||||||
appBarTheme: AppBarTheme(
|
appBarTheme: const AppBarTheme(
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
systemOverlayStyle: SystemUiOverlayStyle.dark,
|
systemOverlayStyle: SystemUiOverlayStyle.dark,
|
||||||
backgroundColor: Colors.white,
|
backgroundColor: Colors.white,
|
||||||
@ -122,10 +122,10 @@ abstract class FluffyThemes {
|
|||||||
|
|
||||||
static ThemeData dark = ThemeData.dark().copyWith(
|
static ThemeData dark = ThemeData.dark().copyWith(
|
||||||
visualDensity: VisualDensity.standard,
|
visualDensity: VisualDensity.standard,
|
||||||
primaryColorDark: Color(0xff121212),
|
primaryColorDark: const Color(0xff121212),
|
||||||
primaryColorLight: Colors.white,
|
primaryColorLight: Colors.white,
|
||||||
primaryColor: AppConfig.primaryColor,
|
primaryColor: AppConfig.primaryColor,
|
||||||
errorColor: Color(0xFFCF6679),
|
errorColor: const Color(0xFFCF6679),
|
||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
scaffoldBackgroundColor: Colors.black,
|
scaffoldBackgroundColor: Colors.black,
|
||||||
colorScheme: ThemeData.dark().colorScheme.copyWith(
|
colorScheme: ThemeData.dark().colorScheme.copyWith(
|
||||||
@ -133,8 +133,8 @@ abstract class FluffyThemes {
|
|||||||
secondary: AppConfig.primaryColorLight,
|
secondary: AppConfig.primaryColorLight,
|
||||||
secondaryVariant: AppConfig.secondaryColor,
|
secondaryVariant: AppConfig.secondaryColor,
|
||||||
),
|
),
|
||||||
secondaryHeaderColor: Color(0xff232543),
|
secondaryHeaderColor: const Color(0xff232543),
|
||||||
textTheme: Typography.material2018().white.merge(fallback_text_theme),
|
textTheme: Typography.material2018().white.merge(fallbackTextTheme),
|
||||||
dialogTheme: DialogTheme(
|
dialogTheme: DialogTheme(
|
||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||||
@ -152,7 +152,7 @@ abstract class FluffyThemes {
|
|||||||
),
|
),
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
),
|
),
|
||||||
pageTransitionsTheme: PageTransitionsTheme(
|
pageTransitionsTheme: const PageTransitionsTheme(
|
||||||
builders: {
|
builders: {
|
||||||
TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(),
|
TargetPlatform.fuchsia: ZoomPageTransitionsBuilder(),
|
||||||
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
TargetPlatform.android: ZoomPageTransitionsBuilder(),
|
||||||
@ -162,7 +162,7 @@ abstract class FluffyThemes {
|
|||||||
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
|
TargetPlatform.iOS: CupertinoPageTransitionsBuilder(),
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
floatingActionButtonTheme: FloatingActionButtonThemeData(
|
floatingActionButtonTheme: const FloatingActionButtonThemeData(
|
||||||
backgroundColor: AppConfig.primaryColor,
|
backgroundColor: AppConfig.primaryColor,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
),
|
),
|
||||||
@ -192,11 +192,11 @@ abstract class FluffyThemes {
|
|||||||
shape: RoundedRectangleBorder(
|
shape: RoundedRectangleBorder(
|
||||||
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
borderRadius: BorderRadius.circular(AppConfig.borderRadius),
|
||||||
),
|
),
|
||||||
padding: EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
snackBarTheme: SnackBarThemeData(behavior: SnackBarBehavior.floating),
|
snackBarTheme: const SnackBarThemeData(behavior: SnackBarBehavior.floating),
|
||||||
appBarTheme: AppBarTheme(
|
appBarTheme: const AppBarTheme(
|
||||||
elevation: 2,
|
elevation: 2,
|
||||||
systemOverlayStyle: SystemUiOverlayStyle.light,
|
systemOverlayStyle: SystemUiOverlayStyle.light,
|
||||||
backgroundColor: Color(0xff1D1D1D),
|
backgroundColor: Color(0xff1D1D1D),
|
||||||
|
@ -53,7 +53,7 @@ void main() async {
|
|||||||
clients: clients,
|
clients: clients,
|
||||||
queryParameters: queryParameters,
|
queryParameters: queryParameters,
|
||||||
),
|
),
|
||||||
lockScreen: LockScreen(),
|
lockScreen: const LockScreen(),
|
||||||
enabled: false,
|
enabled: false,
|
||||||
)
|
)
|
||||||
: FluffyChatApp(clients: clients, queryParameters: queryParameters)),
|
: FluffyChatApp(clients: clients, queryParameters: queryParameters)),
|
||||||
@ -117,7 +117,7 @@ class _FluffyChatAppState extends State<FluffyChatApp> {
|
|||||||
}
|
}
|
||||||
return VRouter(
|
return VRouter(
|
||||||
key: _router,
|
key: _router,
|
||||||
title: '${AppConfig.applicationName}',
|
title: AppConfig.applicationName,
|
||||||
theme: theme,
|
theme: theme,
|
||||||
scrollBehavior: CustomScrollBehavior(),
|
scrollBehavior: CustomScrollBehavior(),
|
||||||
logs: kReleaseMode ? VLogs.none : VLogs.info,
|
logs: kReleaseMode ? VLogs.none : VLogs.info,
|
||||||
|
@ -7,6 +7,8 @@ import 'package:future_loading_dialog/future_loading_dialog.dart';
|
|||||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||||
|
|
||||||
class Archive extends StatefulWidget {
|
class Archive extends StatefulWidget {
|
||||||
|
const Archive({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ArchiveController createState() => ArchiveController();
|
ArchiveController createState() => ArchiveController();
|
||||||
}
|
}
|
||||||
|
@ -71,8 +71,8 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
_wipe ??= widget.wipe;
|
_wipe ??= widget.wipe;
|
||||||
final buttons = <AdaptiveFlatButton>[];
|
final buttons = <AdaptiveFlatButton>[];
|
||||||
Widget body = PlatformInfos.isCupertinoStyle
|
Widget body = PlatformInfos.isCupertinoStyle
|
||||||
? CupertinoActivityIndicator()
|
? const CupertinoActivityIndicator()
|
||||||
: LinearProgressIndicator();
|
: const LinearProgressIndicator();
|
||||||
titleText = L10n.of(context).loadingPleaseWait;
|
titleText = L10n.of(context).loadingPleaseWait;
|
||||||
|
|
||||||
if (bootstrap == null) {
|
if (bootstrap == null) {
|
||||||
@ -96,7 +96,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: Navigator.of(context).pop,
|
onPressed: Navigator.of(context).pop,
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).securityKey),
|
title: Text(L10n.of(context).securityKey),
|
||||||
@ -104,7 +104,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
body: Center(
|
body: Center(
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints:
|
constraints:
|
||||||
BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5),
|
const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5),
|
||||||
child: ListView(
|
child: ListView(
|
||||||
padding: const EdgeInsets.all(16.0),
|
padding: const EdgeInsets.all(16.0),
|
||||||
children: [
|
children: [
|
||||||
@ -116,7 +116,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
ElevatedButton.icon(
|
ElevatedButton.icon(
|
||||||
icon: Icon(Icons.copy_outlined),
|
icon: const Icon(Icons.copy_outlined),
|
||||||
label: Text(L10n.of(context).copyToClipboard),
|
label: Text(L10n.of(context).copyToClipboard),
|
||||||
onPressed: () => Clipboard.setData(ClipboardData(text: key)),
|
onPressed: () => Clipboard.setData(ClipboardData(text: key)),
|
||||||
),
|
),
|
||||||
@ -126,7 +126,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
primary: Theme.of(context).secondaryHeaderColor,
|
primary: Theme.of(context).secondaryHeaderColor,
|
||||||
onPrimary: Theme.of(context).primaryColor,
|
onPrimary: Theme.of(context).primaryColor,
|
||||||
),
|
),
|
||||||
icon: Icon(Icons.check_outlined),
|
icon: const Icon(Icons.check_outlined),
|
||||||
label: Text(L10n.of(context).iWroteDownTheKey),
|
label: Text(L10n.of(context).iWroteDownTheKey),
|
||||||
onPressed: () => setState(() => _recoveryKeyStored = true),
|
onPressed: () => setState(() => _recoveryKeyStored = true),
|
||||||
),
|
),
|
||||||
@ -170,7 +170,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
centerTitle: true,
|
centerTitle: true,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: Navigator.of(context).pop,
|
onPressed: Navigator.of(context).pop,
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).pleaseEnterSecurityKey),
|
title: Text(L10n.of(context).pleaseEnterSecurityKey),
|
||||||
@ -178,7 +178,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
body: Center(
|
body: Center(
|
||||||
child: ConstrainedBox(
|
child: ConstrainedBox(
|
||||||
constraints:
|
constraints:
|
||||||
BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5),
|
const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5),
|
||||||
child: ListView(
|
child: ListView(
|
||||||
padding: const EdgeInsets.all(16.0),
|
padding: const EdgeInsets.all(16.0),
|
||||||
children: [
|
children: [
|
||||||
@ -199,7 +199,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
ElevatedButton.icon(
|
ElevatedButton.icon(
|
||||||
icon: Icon(Icons.lock_open_outlined),
|
icon: const Icon(Icons.lock_open_outlined),
|
||||||
label: Text(L10n.of(context).unlockChatBackup),
|
label: Text(L10n.of(context).unlockChatBackup),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -222,12 +222,12 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
}),
|
}),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Row(children: [
|
Row(children: [
|
||||||
Expanded(child: Divider()),
|
const Expanded(child: Divider()),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.all(12.0),
|
padding: const EdgeInsets.all(12.0),
|
||||||
child: Text(L10n.of(context).or),
|
child: Text(L10n.of(context).or),
|
||||||
),
|
),
|
||||||
Expanded(child: Divider()),
|
const Expanded(child: Divider()),
|
||||||
]),
|
]),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
ElevatedButton.icon(
|
ElevatedButton.icon(
|
||||||
@ -235,7 +235,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
primary: Theme.of(context).secondaryHeaderColor,
|
primary: Theme.of(context).secondaryHeaderColor,
|
||||||
onPrimary: Theme.of(context).primaryColor,
|
onPrimary: Theme.of(context).primaryColor,
|
||||||
),
|
),
|
||||||
icon: Icon(Icons.transfer_within_a_station_outlined),
|
icon: const Icon(Icons.transfer_within_a_station_outlined),
|
||||||
label: Text(L10n.of(context).transferFromAnotherDevice),
|
label: Text(L10n.of(context).transferFromAnotherDevice),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
final req = await showFutureLoadingDialog(
|
final req = await showFutureLoadingDialog(
|
||||||
@ -256,7 +256,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
primary: Theme.of(context).secondaryHeaderColor,
|
primary: Theme.of(context).secondaryHeaderColor,
|
||||||
onPrimary: Colors.red,
|
onPrimary: Colors.red,
|
||||||
),
|
),
|
||||||
icon: Icon(Icons.delete_outlined),
|
icon: const Icon(Icons.delete_outlined),
|
||||||
label: Text(L10n.of(context).securityKeyLost),
|
label: Text(L10n.of(context).securityKeyLost),
|
||||||
onPressed: () async {
|
onPressed: () async {
|
||||||
if (OkCancelResult.ok ==
|
if (OkCancelResult.ok ==
|
||||||
@ -305,7 +305,7 @@ class _BootstrapDialogState extends State<BootstrapDialog> {
|
|||||||
break;
|
break;
|
||||||
case BootstrapState.error:
|
case BootstrapState.error:
|
||||||
titleText = L10n.of(context).oopsSomethingWentWrong;
|
titleText = L10n.of(context).oopsSomethingWentWrong;
|
||||||
body = Icon(Icons.error_outline, color: Colors.red, size: 40);
|
body = const Icon(Icons.error_outline, color: Colors.red, size: 40);
|
||||||
buttons.add(AdaptiveFlatButton(
|
buttons.add(AdaptiveFlatButton(
|
||||||
label: L10n.of(context).close,
|
label: L10n.of(context).close,
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
|
@ -37,7 +37,7 @@ import '../utils/account_bundles.dart';
|
|||||||
class Chat extends StatefulWidget {
|
class Chat extends StatefulWidget {
|
||||||
final Widget sideView;
|
final Widget sideView;
|
||||||
|
|
||||||
Chat({Key key, this.sideView}) : super(key: key);
|
const Chat({Key key, this.sideView}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ChatController createState() => ChatController();
|
ChatController createState() => ChatController();
|
||||||
@ -269,7 +269,7 @@ class ChatController extends State<Chat> {
|
|||||||
parseCommands: parseCommands);
|
parseCommands: parseCommands);
|
||||||
sendController.value = TextEditingValue(
|
sendController.value = TextEditingValue(
|
||||||
text: pendingText,
|
text: pendingText,
|
||||||
selection: TextSelection.collapsed(offset: 0),
|
selection: const TextSelection.collapsed(offset: 0),
|
||||||
);
|
);
|
||||||
|
|
||||||
setState(() {
|
setState(() {
|
||||||
@ -360,7 +360,7 @@ class ChatController extends State<Chat> {
|
|||||||
final result = await showDialog<String>(
|
final result = await showDialog<String>(
|
||||||
context: context,
|
context: context,
|
||||||
useRootNavigator: false,
|
useRootNavigator: false,
|
||||||
builder: (c) => RecordingDialog(),
|
builder: (c) => const RecordingDialog(),
|
||||||
);
|
);
|
||||||
if (result == null) return;
|
if (result == null) return;
|
||||||
final audioFile = File(result);
|
final audioFile = File(result);
|
||||||
@ -705,11 +705,11 @@ class ChatController extends State<Chat> {
|
|||||||
|
|
||||||
int findChildIndexCallback(Key key, Map<String, int> thisEventsKeyMap) {
|
int findChildIndexCallback(Key key, Map<String, int> thisEventsKeyMap) {
|
||||||
// this method is called very often. As such, it has to be optimized for speed.
|
// this method is called very often. As such, it has to be optimized for speed.
|
||||||
if (!(key is ValueKey)) {
|
if (key is! ValueKey) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final eventId = (key as ValueKey).value;
|
final eventId = (key as ValueKey).value;
|
||||||
if (!(eventId is String)) {
|
if (eventId is! String) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
// first fetch the last index the event was at
|
// first fetch the last index the event was at
|
||||||
@ -764,18 +764,18 @@ class ChatController extends State<Chat> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
typingCoolDown?.cancel();
|
typingCoolDown?.cancel();
|
||||||
typingCoolDown = Timer(Duration(seconds: 2), () {
|
typingCoolDown = Timer(const Duration(seconds: 2), () {
|
||||||
typingCoolDown = null;
|
typingCoolDown = null;
|
||||||
currentlyTyping = false;
|
currentlyTyping = false;
|
||||||
room.setTyping(false);
|
room.setTyping(false);
|
||||||
});
|
});
|
||||||
typingTimeout ??= Timer(Duration(seconds: 30), () {
|
typingTimeout ??= Timer(const Duration(seconds: 30), () {
|
||||||
typingTimeout = null;
|
typingTimeout = null;
|
||||||
currentlyTyping = false;
|
currentlyTyping = false;
|
||||||
});
|
});
|
||||||
if (!currentlyTyping) {
|
if (!currentlyTyping) {
|
||||||
currentlyTyping = true;
|
currentlyTyping = true;
|
||||||
room.setTyping(true, timeout: Duration(seconds: 30).inMilliseconds);
|
room.setTyping(true, timeout: const Duration(seconds: 30).inMilliseconds);
|
||||||
}
|
}
|
||||||
setState(() => inputText = text);
|
setState(() => inputText = text);
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@ import 'package:vrouter/vrouter.dart';
|
|||||||
enum AliasActions { copy, delete, setCanonical }
|
enum AliasActions { copy, delete, setCanonical }
|
||||||
|
|
||||||
class ChatDetails extends StatefulWidget {
|
class ChatDetails extends StatefulWidget {
|
||||||
const ChatDetails();
|
const ChatDetails({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ChatDetailsController createState() => ChatDetailsController();
|
ChatDetailsController createState() => ChatDetailsController();
|
||||||
@ -297,7 +297,7 @@ class ChatDetailsController extends State<ChatDetails> {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
members ??= Matrix.of(context).client.getRoomById(roomId).getParticipants();
|
members ??= Matrix.of(context).client.getRoomById(roomId).getParticipants();
|
||||||
return Container(
|
return SizedBox(
|
||||||
width: 360.0,
|
width: 360.0,
|
||||||
child: ChatDetailsView(this),
|
child: ChatDetailsView(this),
|
||||||
);
|
);
|
||||||
|
@ -16,17 +16,19 @@ class ChatEncryptionSettings extends StatefulWidget {
|
|||||||
|
|
||||||
class ChatEncryptionSettingsController extends State<ChatEncryptionSettings> {
|
class ChatEncryptionSettingsController extends State<ChatEncryptionSettings> {
|
||||||
String get roomId => VRouter.of(context).pathParameters['roomid'];
|
String get roomId => VRouter.of(context).pathParameters['roomid'];
|
||||||
Future<void> onSelected(
|
|
||||||
BuildContext context, String action, DeviceKeys key) async {
|
Future<void> unblock(DeviceKeys key) async {
|
||||||
final room = Matrix.of(context).client.getRoomById(roomId);
|
|
||||||
final unblock = () async {
|
|
||||||
if (key.blocked) {
|
if (key.blocked) {
|
||||||
await key.setBlocked(false);
|
await key.setBlocked(false);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
Future<void> onSelected(
|
||||||
|
BuildContext context, String action, DeviceKeys key) async {
|
||||||
|
final room = Matrix.of(context).client.getRoomById(roomId);
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'verify':
|
case 'verify':
|
||||||
await unblock();
|
await unblock(key);
|
||||||
final req = key.startVerification();
|
final req = key.startVerification();
|
||||||
req.onUpdate = () {
|
req.onUpdate = () {
|
||||||
if (req.state == KeyVerificationState.done) {
|
if (req.state == KeyVerificationState.done) {
|
||||||
@ -36,7 +38,7 @@ class ChatEncryptionSettingsController extends State<ChatEncryptionSettings> {
|
|||||||
await KeyVerificationDialog(request: req).show(context);
|
await KeyVerificationDialog(request: req).show(context);
|
||||||
break;
|
break;
|
||||||
case 'verify_user':
|
case 'verify_user':
|
||||||
await unblock();
|
await unblock(key);
|
||||||
final req =
|
final req =
|
||||||
await room.client.userDeviceKeys[key.userId].startVerification();
|
await room.client.userDeviceKeys[key.userId].startVerification();
|
||||||
req.onUpdate = () {
|
req.onUpdate = () {
|
||||||
@ -54,7 +56,7 @@ class ChatEncryptionSettingsController extends State<ChatEncryptionSettings> {
|
|||||||
setState(() => null);
|
setState(() => null);
|
||||||
break;
|
break;
|
||||||
case 'unblock':
|
case 'unblock':
|
||||||
await unblock();
|
await unblock(key);
|
||||||
setState(() => null);
|
setState(() => null);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,8 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||||||
import '../widgets/matrix.dart';
|
import '../widgets/matrix.dart';
|
||||||
|
|
||||||
class DevicesSettings extends StatefulWidget {
|
class DevicesSettings extends StatefulWidget {
|
||||||
|
const DevicesSettings({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
DevicesSettingsController createState() => DevicesSettingsController();
|
DevicesSettingsController createState() => DevicesSettingsController();
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,8 @@ import 'package:uni_links/uni_links.dart';
|
|||||||
import '../main.dart';
|
import '../main.dart';
|
||||||
|
|
||||||
class HomeserverPicker extends StatefulWidget {
|
class HomeserverPicker extends StatefulWidget {
|
||||||
|
const HomeserverPicker({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
HomeserverPickerController createState() => HomeserverPickerController();
|
HomeserverPickerController createState() => HomeserverPickerController();
|
||||||
}
|
}
|
||||||
@ -37,7 +39,7 @@ class HomeserverPickerController extends State<HomeserverPicker> {
|
|||||||
this.domain = domain;
|
this.domain = domain;
|
||||||
_coolDown?.cancel();
|
_coolDown?.cancel();
|
||||||
if (domain.isNotEmpty) {
|
if (domain.isNotEmpty) {
|
||||||
_coolDown = Timer(Duration(seconds: 1), checkHomeserverAction);
|
_coolDown = Timer(const Duration(seconds: 1), checkHomeserverAction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,7 +135,7 @@ class HomeserverPickerController extends State<HomeserverPicker> {
|
|||||||
AppConfig.jitsiInstance = jitsi;
|
AppConfig.jitsiInstance = jitsi;
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setState(() => error = '${(e as Object).toLocalizedString(context)}');
|
setState(() => error = (e as Object).toLocalizedString(context));
|
||||||
} finally {
|
} finally {
|
||||||
if (mounted) {
|
if (mounted) {
|
||||||
setState(() => isLoading = false);
|
setState(() => isLoading = false);
|
||||||
|
@ -70,7 +70,7 @@ class InvitationSelectionController extends State<InvitationSelection> {
|
|||||||
void searchUserWithCoolDown(String text) async {
|
void searchUserWithCoolDown(String text) async {
|
||||||
coolDown?.cancel();
|
coolDown?.cancel();
|
||||||
coolDown = Timer(
|
coolDown = Timer(
|
||||||
Duration(seconds: 1),
|
const Duration(seconds: 1),
|
||||||
() => searchUser(context, text),
|
() => searchUser(context, text),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -31,9 +31,10 @@ class KeyVerificationDialog extends StatefulWidget {
|
|||||||
|
|
||||||
final KeyVerification request;
|
final KeyVerification request;
|
||||||
|
|
||||||
KeyVerificationDialog({
|
const KeyVerificationDialog({
|
||||||
|
Key key,
|
||||||
this.request,
|
this.request,
|
||||||
});
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_KeyVerificationPageState createState() => _KeyVerificationPageState();
|
_KeyVerificationPageState createState() => _KeyVerificationPageState();
|
||||||
@ -76,6 +77,33 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
|
|
||||||
Profile profile;
|
Profile profile;
|
||||||
|
|
||||||
|
Future<void> checkInput(String input) async {
|
||||||
|
if (input == null || input.isEmpty) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
final valid = await showFutureLoadingDialog(
|
||||||
|
context: context,
|
||||||
|
future: () async {
|
||||||
|
// make sure the loading spinner shows before we test the keys
|
||||||
|
await Future.delayed(const Duration(milliseconds: 100));
|
||||||
|
var valid = false;
|
||||||
|
try {
|
||||||
|
await widget.request.openSSSS(keyOrPassphrase: input);
|
||||||
|
valid = true;
|
||||||
|
} catch (_) {
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
return valid;
|
||||||
|
});
|
||||||
|
if (valid.error != null) {
|
||||||
|
await showOkAlertDialog(
|
||||||
|
useRootNavigator: false,
|
||||||
|
context: context,
|
||||||
|
message: L10n.of(context).incorrectPassphraseOrKey,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
User user;
|
User user;
|
||||||
@ -96,39 +124,13 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
// prompt the user for their ssss passphrase / key
|
// prompt the user for their ssss passphrase / key
|
||||||
final textEditingController = TextEditingController();
|
final textEditingController = TextEditingController();
|
||||||
String input;
|
String input;
|
||||||
final checkInput = () async {
|
|
||||||
if (input == null || input.isEmpty) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
final valid = await showFutureLoadingDialog(
|
|
||||||
context: context,
|
|
||||||
future: () async {
|
|
||||||
// make sure the loading spinner shows before we test the keys
|
|
||||||
await Future.delayed(Duration(milliseconds: 100));
|
|
||||||
var valid = false;
|
|
||||||
try {
|
|
||||||
await widget.request.openSSSS(keyOrPassphrase: input);
|
|
||||||
valid = true;
|
|
||||||
} catch (_) {
|
|
||||||
valid = false;
|
|
||||||
}
|
|
||||||
return valid;
|
|
||||||
});
|
|
||||||
if (valid.error != null) {
|
|
||||||
await showOkAlertDialog(
|
|
||||||
useRootNavigator: false,
|
|
||||||
context: context,
|
|
||||||
message: L10n.of(context).incorrectPassphraseOrKey,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
body = Container(
|
body = Container(
|
||||||
margin: EdgeInsets.only(left: 8.0, right: 8.0),
|
margin: const EdgeInsets.only(left: 8.0, right: 8.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(L10n.of(context).askSSSSSign,
|
Text(L10n.of(context).askSSSSSign,
|
||||||
style: TextStyle(fontSize: 20)),
|
style: const TextStyle(fontSize: 20)),
|
||||||
Container(height: 10),
|
Container(height: 10),
|
||||||
TextField(
|
TextField(
|
||||||
controller: textEditingController,
|
controller: textEditingController,
|
||||||
@ -136,7 +138,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
autocorrect: false,
|
autocorrect: false,
|
||||||
onSubmitted: (s) {
|
onSubmitted: (s) {
|
||||||
input = s;
|
input = s;
|
||||||
checkInput();
|
checkInput(input);
|
||||||
},
|
},
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
@ -145,7 +147,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
hintText: L10n.of(context).passphraseOrKey,
|
hintText: L10n.of(context).passphraseOrKey,
|
||||||
prefixStyle: TextStyle(color: Theme.of(context).primaryColor),
|
prefixStyle: TextStyle(color: Theme.of(context).primaryColor),
|
||||||
suffixStyle: TextStyle(color: Theme.of(context).primaryColor),
|
suffixStyle: TextStyle(color: Theme.of(context).primaryColor),
|
||||||
border: OutlineInputBorder(),
|
border: const OutlineInputBorder(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -155,7 +157,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
label: L10n.of(context).submit,
|
label: L10n.of(context).submit,
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
input = textEditingController.text;
|
input = textEditingController.text;
|
||||||
checkInput();
|
checkInput(input);
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
buttons.add(AdaptiveFlatButton(
|
buttons.add(AdaptiveFlatButton(
|
||||||
@ -171,7 +173,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
Row(children: [
|
Row(children: [
|
||||||
if (!PlatformInfos.isCupertinoStyle)
|
if (!PlatformInfos.isCupertinoStyle)
|
||||||
Avatar(user?.avatarUrl, displayName),
|
Avatar(user?.avatarUrl, displayName),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
@ -181,11 +183,11 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
displayName,
|
displayName,
|
||||||
style: TextStyle(fontSize: 16),
|
style: const TextStyle(fontSize: 16),
|
||||||
),
|
),
|
||||||
Text(
|
Text(
|
||||||
'${widget.request.userId} - ${widget.request.deviceId}',
|
'${widget.request.userId} - ${widget.request.deviceId}',
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontWeight: FontWeight.w300,
|
fontWeight: FontWeight.w300,
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
),
|
),
|
||||||
@ -222,7 +224,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Image.asset('assets/verification.png', fit: BoxFit.contain),
|
Image.asset('assets/verification.png', fit: BoxFit.contain),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
CircularProgressIndicator.adaptive(strokeWidth: 2),
|
const CircularProgressIndicator.adaptive(strokeWidth: 2),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Text(
|
Text(
|
||||||
L10n.of(context).waitingPartnerAcceptRequest,
|
L10n.of(context).waitingPartnerAcceptRequest,
|
||||||
@ -269,7 +271,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
final numbers = widget.request.sasNumbers;
|
final numbers = widget.request.sasNumbers;
|
||||||
final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}';
|
final numbstr = '${numbers[0]}-${numbers[1]}-${numbers[2]}';
|
||||||
compareWidget =
|
compareWidget =
|
||||||
TextSpan(text: numbstr, style: TextStyle(fontSize: 40));
|
TextSpan(text: numbstr, style: const TextStyle(fontSize: 40));
|
||||||
}
|
}
|
||||||
body = Column(
|
body = Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
@ -277,11 +279,11 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
Center(
|
Center(
|
||||||
child: Text(
|
child: Text(
|
||||||
compareText,
|
compareText,
|
||||||
style: TextStyle(fontSize: 16),
|
style: const TextStyle(fontSize: 16),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text.rich(
|
Text.rich(
|
||||||
compareWidget,
|
compareWidget,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
@ -305,8 +307,8 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
body = Column(
|
body = Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
CircularProgressIndicator.adaptive(strokeWidth: 2),
|
const CircularProgressIndicator.adaptive(strokeWidth: 2),
|
||||||
SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text(
|
Text(
|
||||||
acceptText,
|
acceptText,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
@ -318,8 +320,9 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
body = Column(
|
body = Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(Icons.check_circle_outlined, color: Colors.green, size: 200.0),
|
const Icon(Icons.check_circle_outlined,
|
||||||
SizedBox(height: 10),
|
color: Colors.green, size: 200.0),
|
||||||
|
const SizedBox(height: 10),
|
||||||
Text(
|
Text(
|
||||||
L10n.of(context).verifySuccess,
|
L10n.of(context).verifySuccess,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
@ -335,8 +338,8 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
body = Column(
|
body = Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(Icons.cancel, color: Colors.red, size: 200.0),
|
const Icon(Icons.cancel, color: Colors.red, size: 200.0),
|
||||||
SizedBox(height: 10),
|
const SizedBox(height: 10),
|
||||||
Text(
|
Text(
|
||||||
'Error ${widget.request.canceledCode}: ${widget.request.canceledReason}',
|
'Error ${widget.request.canceledCode}: ${widget.request.canceledReason}',
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
@ -355,7 +358,7 @@ class _KeyVerificationPageState extends State<KeyVerificationDialog> {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
body,
|
body,
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -379,7 +382,7 @@ class _Emoji extends StatelessWidget {
|
|||||||
final KeyVerificationEmoji emoji;
|
final KeyVerificationEmoji emoji;
|
||||||
final List<dynamic> sasEmoji;
|
final List<dynamic> sasEmoji;
|
||||||
|
|
||||||
_Emoji(this.emoji, this.sasEmoji);
|
const _Emoji(this.emoji, this.sasEmoji);
|
||||||
|
|
||||||
String getLocalizedName() {
|
String getLocalizedName() {
|
||||||
if (sasEmoji == null) {
|
if (sasEmoji == null) {
|
||||||
@ -410,9 +413,9 @@ class _Emoji extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(emoji.emoji, style: TextStyle(fontSize: 50)),
|
Text(emoji.emoji, style: const TextStyle(fontSize: 50)),
|
||||||
Text(getLocalizedName()),
|
Text(getLocalizedName()),
|
||||||
Container(height: 10, width: 5),
|
const SizedBox(height: 10, width: 5),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@ import '../config/setting_keys.dart';
|
|||||||
import 'views/login_view.dart';
|
import 'views/login_view.dart';
|
||||||
|
|
||||||
class Login extends StatefulWidget {
|
class Login extends StatefulWidget {
|
||||||
|
const Login({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
LoginController createState() => LoginController();
|
LoginController createState() => LoginController();
|
||||||
}
|
}
|
||||||
@ -89,7 +91,7 @@ class LoginController extends State<Login> {
|
|||||||
void checkWellKnownWithCoolDown(String userId) async {
|
void checkWellKnownWithCoolDown(String userId) async {
|
||||||
_coolDown?.cancel();
|
_coolDown?.cancel();
|
||||||
_coolDown = Timer(
|
_coolDown = Timer(
|
||||||
Duration(seconds: 1),
|
const Duration(seconds: 1),
|
||||||
() => _checkWellKnown(userId),
|
() => _checkWellKnown(userId),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -202,7 +204,7 @@ class LoginController extends State<Login> {
|
|||||||
okLabel: L10n.of(context).ok,
|
okLabel: L10n.of(context).ok,
|
||||||
cancelLabel: L10n.of(context).cancel,
|
cancelLabel: L10n.of(context).cancel,
|
||||||
textFields: [
|
textFields: [
|
||||||
DialogTextField(
|
const DialogTextField(
|
||||||
hintText: '******',
|
hintText: '******',
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
|
@ -6,6 +6,8 @@ import 'package:flutter/material.dart';
|
|||||||
import 'package:vrouter/vrouter.dart';
|
import 'package:vrouter/vrouter.dart';
|
||||||
|
|
||||||
class NewGroup extends StatefulWidget {
|
class NewGroup extends StatefulWidget {
|
||||||
|
const NewGroup({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
NewGroupController createState() => NewGroupController();
|
NewGroupController createState() => NewGroupController();
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
|
|
||||||
class NewPrivateChat extends StatefulWidget {
|
class NewPrivateChat extends StatefulWidget {
|
||||||
|
const NewPrivateChat({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
NewPrivateChatController createState() => NewPrivateChatController();
|
NewPrivateChatController createState() => NewPrivateChatController();
|
||||||
}
|
}
|
||||||
@ -54,7 +56,7 @@ class NewPrivateChatController extends State<NewPrivateChat> {
|
|||||||
context: context,
|
context: context,
|
||||||
useRootNavigator: false,
|
useRootNavigator: false,
|
||||||
//useSafeArea: false,
|
//useSafeArea: false,
|
||||||
builder: (_) => QrScannerModal(),
|
builder: (_) => const QrScannerModal(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,8 @@ import 'package:matrix/matrix.dart';
|
|||||||
import 'package:vrouter/vrouter.dart';
|
import 'package:vrouter/vrouter.dart';
|
||||||
|
|
||||||
class NewSpace extends StatefulWidget {
|
class NewSpace extends StatefulWidget {
|
||||||
|
const NewSpace({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
NewSpaceController createState() => NewSpaceController();
|
NewSpaceController createState() => NewSpaceController();
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@ class _PermissionSliderDialogState extends State<PermissionSliderDialog> {
|
|||||||
: _permission >= 50
|
: _permission >= 50
|
||||||
? '$_permission (${L10n.of(context).moderator})'
|
? '$_permission (${L10n.of(context).moderator})'
|
||||||
: _permission.toString())),
|
: _permission.toString())),
|
||||||
Container(
|
SizedBox(
|
||||||
height: 56,
|
height: 56,
|
||||||
child: slider,
|
child: slider,
|
||||||
),
|
),
|
||||||
|
@ -32,7 +32,7 @@ class _QrScannerModalState extends State<QrScannerModal> {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: Navigator.of(context).pop,
|
onPressed: Navigator.of(context).pop,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
),
|
),
|
||||||
|
@ -45,10 +45,10 @@ class _RecordingDialogState extends State<RecordingDialog> {
|
|||||||
setState(() => _duration = Duration.zero);
|
setState(() => _duration = Duration.zero);
|
||||||
_recorderSubscription?.cancel();
|
_recorderSubscription?.cancel();
|
||||||
_recorderSubscription =
|
_recorderSubscription =
|
||||||
Timer.periodic(Duration(milliseconds: 100), (_) async {
|
Timer.periodic(const Duration(milliseconds: 100), (_) async {
|
||||||
_amplitude = await _audioRecorder.getAmplitude();
|
_amplitude = await _audioRecorder.getAmplitude();
|
||||||
setState(() {
|
setState(() {
|
||||||
_duration += Duration(milliseconds: 100);
|
_duration += const Duration(milliseconds: 100);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
} catch (e, s) {
|
} catch (e, s) {
|
||||||
@ -92,7 +92,7 @@ class _RecordingDialogState extends State<RecordingDialog> {
|
|||||||
height: maxDecibalWidth,
|
height: maxDecibalWidth,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: AnimatedContainer(
|
child: AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 100),
|
duration: const Duration(milliseconds: 100),
|
||||||
width: decibalWidth,
|
width: decibalWidth,
|
||||||
height: decibalWidth,
|
height: decibalWidth,
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
@ -101,11 +101,11 @@ class _RecordingDialogState extends State<RecordingDialog> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
'${L10n.of(context).recording}: $time',
|
'${L10n.of(context).recording}: $time',
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 18,
|
fontSize: 18,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -163,8 +163,8 @@ class _RecordingDialogState extends State<RecordingDialog> {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(L10n.of(context).send.toUpperCase()),
|
Text(L10n.of(context).send.toUpperCase()),
|
||||||
SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Icon(Icons.send_outlined, size: 15),
|
const Icon(Icons.send_outlined, size: 15),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -28,7 +28,7 @@ class SearchController extends State<Search> {
|
|||||||
setState(() => null);
|
setState(() => null);
|
||||||
_coolDown?.cancel();
|
_coolDown?.cancel();
|
||||||
_coolDown = Timer(
|
_coolDown = Timer(
|
||||||
Duration(milliseconds: 500),
|
const Duration(milliseconds: 500),
|
||||||
() => setState(() {
|
() => setState(() {
|
||||||
genericSearchTerm = query;
|
genericSearchTerm = query;
|
||||||
publicRoomsResponse = null;
|
publicRoomsResponse = null;
|
||||||
|
@ -57,12 +57,12 @@ class _SendLocationDialogState extends State<SendLocationDialog> {
|
|||||||
try {
|
try {
|
||||||
_position = await Geolocator.getCurrentPosition(
|
_position = await Geolocator.getCurrentPosition(
|
||||||
desiredAccuracy: LocationAccuracy.best,
|
desiredAccuracy: LocationAccuracy.best,
|
||||||
timeLimit: Duration(seconds: 30),
|
timeLimit: const Duration(seconds: 30),
|
||||||
);
|
);
|
||||||
} on TimeoutException {
|
} on TimeoutException {
|
||||||
_position = await Geolocator.getCurrentPosition(
|
_position = await Geolocator.getCurrentPosition(
|
||||||
desiredAccuracy: LocationAccuracy.medium,
|
desiredAccuracy: LocationAccuracy.medium,
|
||||||
timeLimit: Duration(seconds: 30),
|
timeLimit: const Duration(seconds: 30),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
setState(() => position = _position);
|
setState(() => position = _position);
|
||||||
@ -104,8 +104,8 @@ class _SendLocationDialogState extends State<SendLocationDialog> {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
CupertinoActivityIndicator(),
|
const CupertinoActivityIndicator(),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).obtainingLocation),
|
Text(L10n.of(context).obtainingLocation),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -16,6 +16,8 @@ import 'package:future_loading_dialog/future_loading_dialog.dart';
|
|||||||
import '../widgets/matrix.dart';
|
import '../widgets/matrix.dart';
|
||||||
|
|
||||||
class Settings extends StatefulWidget {
|
class Settings extends StatefulWidget {
|
||||||
|
const Settings({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SettingsController createState() => SettingsController();
|
SettingsController createState() => SettingsController();
|
||||||
}
|
}
|
||||||
@ -117,7 +119,7 @@ class SettingsController extends State<Settings> {
|
|||||||
context: context,
|
context: context,
|
||||||
future: () async {
|
future: () async {
|
||||||
// make sure the loading spinner shows before we test the keys
|
// make sure the loading spinner shows before we test the keys
|
||||||
await Future.delayed(Duration(milliseconds: 100));
|
await Future.delayed(const Duration(milliseconds: 100));
|
||||||
var valid = false;
|
var valid = false;
|
||||||
try {
|
try {
|
||||||
await handle.unlock(recoveryKey: input.single);
|
await handle.unlock(recoveryKey: input.single);
|
||||||
|
@ -10,6 +10,8 @@ import 'views/settings_3pid_view.dart';
|
|||||||
class Settings3Pid extends StatefulWidget {
|
class Settings3Pid extends StatefulWidget {
|
||||||
static int sendAttempt = 0;
|
static int sendAttempt = 0;
|
||||||
|
|
||||||
|
const Settings3Pid({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Settings3PidController createState() => Settings3PidController();
|
Settings3PidController createState() => Settings3PidController();
|
||||||
}
|
}
|
||||||
|
@ -124,7 +124,7 @@ class SettingsAccountController extends State<SettingsAccount> {
|
|||||||
okLabel: L10n.of(context).ok,
|
okLabel: L10n.of(context).ok,
|
||||||
cancelLabel: L10n.of(context).cancel,
|
cancelLabel: L10n.of(context).cancel,
|
||||||
textFields: [
|
textFields: [
|
||||||
DialogTextField(
|
const DialogTextField(
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
hintText: '******',
|
hintText: '******',
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
|
@ -13,7 +13,7 @@ import '../widgets/matrix.dart';
|
|||||||
import '../utils/resize_image.dart';
|
import '../utils/resize_image.dart';
|
||||||
|
|
||||||
class EmotesSettings extends StatefulWidget {
|
class EmotesSettings extends StatefulWidget {
|
||||||
EmotesSettings({Key key}) : super(key: key);
|
const EmotesSettings({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
EmotesSettingsController createState() => EmotesSettingsController();
|
EmotesSettingsController createState() => EmotesSettingsController();
|
||||||
@ -80,13 +80,13 @@ class EmotesSettingsController extends State<EmotesSettings> {
|
|||||||
final content = client.accountData['im.ponies.emote_rooms']?.content ??
|
final content = client.accountData['im.ponies.emote_rooms']?.content ??
|
||||||
<String, dynamic>{};
|
<String, dynamic>{};
|
||||||
if (active) {
|
if (active) {
|
||||||
if (!(content['rooms'] is Map)) {
|
if (content['rooms'] is! Map) {
|
||||||
content['rooms'] = <String, dynamic>{};
|
content['rooms'] = <String, dynamic>{};
|
||||||
}
|
}
|
||||||
if (!(content['rooms'][room.id] is Map)) {
|
if (content['rooms'][room.id] is! Map) {
|
||||||
content['rooms'][room.id] = <String, dynamic>{};
|
content['rooms'][room.id] = <String, dynamic>{};
|
||||||
}
|
}
|
||||||
if (!(content['rooms'][room.id][stateKey ?? ''] is Map)) {
|
if (content['rooms'][room.id][stateKey ?? ''] is! Map) {
|
||||||
content['rooms'][room.id][stateKey ?? ''] = <String, dynamic>{};
|
content['rooms'][room.id][stateKey ?? ''] = <String, dynamic>{};
|
||||||
}
|
}
|
||||||
} else if (content['rooms'] is Map && content['rooms'][room.id] is Map) {
|
} else if (content['rooms'] is Map && content['rooms'][room.id] is Map) {
|
||||||
|
@ -7,7 +7,7 @@ import '../widgets/matrix.dart';
|
|||||||
class SettingsIgnoreList extends StatefulWidget {
|
class SettingsIgnoreList extends StatefulWidget {
|
||||||
final String initialUserId;
|
final String initialUserId;
|
||||||
|
|
||||||
SettingsIgnoreList({Key key, this.initialUserId}) : super(key: key);
|
const SettingsIgnoreList({Key key, this.initialUserId}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SettingsIgnoreListController createState() => SettingsIgnoreListController();
|
SettingsIgnoreListController createState() => SettingsIgnoreListController();
|
||||||
|
@ -4,7 +4,7 @@ import 'package:vrouter/vrouter.dart';
|
|||||||
import 'views/settings_multiple_emotes_view.dart';
|
import 'views/settings_multiple_emotes_view.dart';
|
||||||
|
|
||||||
class MultipleEmotesSettings extends StatefulWidget {
|
class MultipleEmotesSettings extends StatefulWidget {
|
||||||
MultipleEmotesSettings({Key key}) : super(key: key);
|
const MultipleEmotesSettings({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
MultipleEmotesSettingsController createState() =>
|
MultipleEmotesSettingsController createState() =>
|
||||||
|
@ -49,6 +49,8 @@ class NotificationSettingsItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class SettingsNotifications extends StatefulWidget {
|
class SettingsNotifications extends StatefulWidget {
|
||||||
|
const SettingsNotifications({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SettingsNotificationsController createState() =>
|
SettingsNotificationsController createState() =>
|
||||||
SettingsNotificationsController();
|
SettingsNotificationsController();
|
||||||
@ -57,7 +59,7 @@ class SettingsNotifications extends StatefulWidget {
|
|||||||
class SettingsNotificationsController extends State<SettingsNotifications> {
|
class SettingsNotificationsController extends State<SettingsNotifications> {
|
||||||
void openAndroidNotificationSettingsAction() async {
|
void openAndroidNotificationSettingsAction() async {
|
||||||
await NotificationSetting.configureChannel(
|
await NotificationSetting.configureChannel(
|
||||||
NotificationDetails(
|
const NotificationDetails(
|
||||||
android: AndroidNotificationDetails(
|
android: AndroidNotificationDetails(
|
||||||
AppConfig.pushNotificationsChannelId,
|
AppConfig.pushNotificationsChannelId,
|
||||||
AppConfig.pushNotificationsChannelName,
|
AppConfig.pushNotificationsChannelName,
|
||||||
|
@ -55,7 +55,7 @@ class SettingsSecurityController extends State<SettingsSecurity> {
|
|||||||
|
|
||||||
void setAppLockAction() async {
|
void setAppLockAction() async {
|
||||||
final currentLock =
|
final currentLock =
|
||||||
await FlutterSecureStorage().read(key: SettingKeys.appLockKey);
|
await const FlutterSecureStorage().read(key: SettingKeys.appLockKey);
|
||||||
if (currentLock?.isNotEmpty ?? false) {
|
if (currentLock?.isNotEmpty ?? false) {
|
||||||
await AppLock.of(context).showLockScreen();
|
await AppLock.of(context).showLockScreen();
|
||||||
}
|
}
|
||||||
@ -81,7 +81,7 @@ class SettingsSecurityController extends State<SettingsSecurity> {
|
|||||||
],
|
],
|
||||||
);
|
);
|
||||||
if (newLock != null) {
|
if (newLock != null) {
|
||||||
await FlutterSecureStorage()
|
await const FlutterSecureStorage()
|
||||||
.write(key: SettingKeys.appLockKey, value: newLock.single);
|
.write(key: SettingKeys.appLockKey, value: newLock.single);
|
||||||
if (newLock.single.isEmpty) {
|
if (newLock.single.isEmpty) {
|
||||||
AppLock.of(context).disable();
|
AppLock.of(context).disable();
|
||||||
|
@ -10,6 +10,8 @@ import 'views/settings_style_view.dart';
|
|||||||
import '../widgets/matrix.dart';
|
import '../widgets/matrix.dart';
|
||||||
|
|
||||||
class SettingsStyle extends StatefulWidget {
|
class SettingsStyle extends StatefulWidget {
|
||||||
|
const SettingsStyle({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
SettingsStyleController createState() => SettingsStyleController();
|
SettingsStyleController createState() => SettingsStyleController();
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
|||||||
final stickerPacks = widget.room.getImagePacks(ImagePackUsage.sticker);
|
final stickerPacks = widget.room.getImagePacks(ImagePackUsage.sticker);
|
||||||
final packSlugs = stickerPacks.keys.toList();
|
final packSlugs = stickerPacks.keys.toList();
|
||||||
|
|
||||||
|
// ignore: prefer_function_declarations_over_variables
|
||||||
final _packBuilder = (BuildContext context, int packIndex) {
|
final _packBuilder = (BuildContext context, int packIndex) {
|
||||||
final pack = stickerPacks[packSlugs[packIndex]];
|
final pack = stickerPacks[packSlugs[packIndex]];
|
||||||
final filteredImagePackImageEntried = pack.images.entries.toList();
|
final filteredImagePackImageEntried = pack.images.entries.toList();
|
||||||
@ -43,7 +44,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
|||||||
final packName = pack.pack.displayName ?? packSlugs[packIndex];
|
final packName = pack.pack.displayName ?? packSlugs[packIndex];
|
||||||
return Column(
|
return Column(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (packIndex != 0) SizedBox(height: 20),
|
if (packIndex != 0) const SizedBox(height: 20),
|
||||||
if (packName != 'user')
|
if (packName != 'user')
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Avatar(
|
leading: Avatar(
|
||||||
@ -53,13 +54,13 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
|||||||
),
|
),
|
||||||
title: Text(packName),
|
title: Text(packName),
|
||||||
),
|
),
|
||||||
SizedBox(height: 6),
|
const SizedBox(height: 6),
|
||||||
GridView.builder(
|
GridView.builder(
|
||||||
itemCount: imageKeys.length,
|
itemCount: imageKeys.length,
|
||||||
gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent(
|
gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent(
|
||||||
maxCrossAxisExtent: 100),
|
maxCrossAxisExtent: 100),
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
itemBuilder: (BuildContext context, int imageIndex) {
|
itemBuilder: (BuildContext context, int imageIndex) {
|
||||||
final image = pack.images[imageKeys[imageIndex]];
|
final image = pack.images[imageKeys[imageIndex]];
|
||||||
final fakeEvent = Event.fromJson(<String, dynamic>{
|
final fakeEvent = Event.fromJson(<String, dynamic>{
|
||||||
@ -99,7 +100,7 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Container(
|
body: SizedBox(
|
||||||
width: double.maxFinite,
|
width: double.maxFinite,
|
||||||
child: CustomScrollView(
|
child: CustomScrollView(
|
||||||
slivers: <Widget>[
|
slivers: <Widget>[
|
||||||
@ -110,13 +111,13 @@ class StickerPickerDialogState extends State<StickerPickerDialog> {
|
|||||||
titleSpacing: 0,
|
titleSpacing: 0,
|
||||||
backgroundColor: Theme.of(context).dialogBackgroundColor,
|
backgroundColor: Theme.of(context).dialogBackgroundColor,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
||||||
),
|
),
|
||||||
title: DefaultAppBarSearchField(
|
title: DefaultAppBarSearchField(
|
||||||
autofocus: false,
|
autofocus: false,
|
||||||
hintText: L10n.of(context).search,
|
hintText: L10n.of(context).search,
|
||||||
suffix: Icon(Icons.search_outlined),
|
suffix: const Icon(Icons.search_outlined),
|
||||||
onChanged: (s) => setState(() => searchFilter = s),
|
onChanged: (s) => setState(() => searchFilter = s),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -28,6 +28,7 @@ class UserBottomSheet extends StatefulWidget {
|
|||||||
|
|
||||||
class UserBottomSheetController extends State<UserBottomSheet> {
|
class UserBottomSheetController extends State<UserBottomSheet> {
|
||||||
void participantAction(String action) async {
|
void participantAction(String action) async {
|
||||||
|
// ignore: prefer_function_declarations_over_variables
|
||||||
final Function _askConfirmation =
|
final Function _askConfirmation =
|
||||||
() async => (await showOkCancelAlertDialog(
|
() async => (await showOkCancelAlertDialog(
|
||||||
useRootNavigator: false,
|
useRootNavigator: false,
|
||||||
|
@ -15,7 +15,7 @@ class ArchiveView extends StatelessWidget {
|
|||||||
future: controller.getArchive(context),
|
future: controller.getArchive(context),
|
||||||
builder: (BuildContext context, snapshot) => Scaffold(
|
builder: (BuildContext context, snapshot) => Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).archive),
|
title: Text(L10n.of(context).archive),
|
||||||
actions: [
|
actions: [
|
||||||
if (snapshot.hasData &&
|
if (snapshot.hasData &&
|
||||||
@ -37,12 +37,12 @@ class ArchiveView extends StatelessWidget {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
||||||
} else {
|
} else {
|
||||||
controller.archive = snapshot.data;
|
controller.archive = snapshot.data;
|
||||||
if (controller.archive.isEmpty) {
|
if (controller.archive.isEmpty) {
|
||||||
return Center(child: Icon(Icons.archive_outlined, size: 80));
|
return const Center(child: Icon(Icons.archive_outlined, size: 80));
|
||||||
}
|
}
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
itemCount: controller.archive.length,
|
itemCount: controller.archive.length,
|
||||||
|
@ -51,7 +51,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
(BuildContext context, bool innerBoxIsScrolled) => <Widget>[
|
(BuildContext context, bool innerBoxIsScrolled) => <Widget>[
|
||||||
SliverAppBar(
|
SliverAppBar(
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).path.startsWith('/spaces/')
|
VRouter.of(context).path.startsWith('/spaces/')
|
||||||
? VRouter.of(context).pop()
|
? VRouter.of(context).pop()
|
||||||
@ -66,7 +66,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
if (room.canonicalAlias?.isNotEmpty ?? false)
|
if (room.canonicalAlias?.isNotEmpty ?? false)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: L10n.of(context).share,
|
tooltip: L10n.of(context).share,
|
||||||
icon: Icon(Icons.share_outlined),
|
icon: const Icon(Icons.share_outlined),
|
||||||
onPressed: () => FluffyShare.share(
|
onPressed: () => FluffyShare.share(
|
||||||
AppConfig.inviteLinkPrefix + room.canonicalAlias,
|
AppConfig.inviteLinkPrefix + room.canonicalAlias,
|
||||||
context),
|
context),
|
||||||
@ -107,7 +107,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
.scaffoldBackgroundColor,
|
.scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
radius: Avatar.defaultSize / 2,
|
radius: Avatar.defaultSize / 2,
|
||||||
child: Icon(Icons.edit_outlined),
|
child: const Icon(Icons.edit_outlined),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
title: Text(
|
title: Text(
|
||||||
@ -121,7 +121,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
text: room.topic?.isEmpty ?? true
|
text: room.topic?.isEmpty ?? true
|
||||||
? L10n.of(context).addGroupDescription
|
? L10n.of(context).addGroupDescription
|
||||||
: room.topic,
|
: room.topic,
|
||||||
linkStyle: TextStyle(color: Colors.blueAccent),
|
linkStyle: const TextStyle(color: Colors.blueAccent),
|
||||||
textStyle: TextStyle(
|
textStyle: TextStyle(
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
color: Theme.of(context)
|
color: Theme.of(context)
|
||||||
@ -136,7 +136,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
? controller.setTopicAction
|
? controller.setTopicAction
|
||||||
: null,
|
: null,
|
||||||
),
|
),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).settings,
|
L10n.of(context).settings,
|
||||||
@ -153,7 +153,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.people_outlined),
|
child: const Icon(Icons.people_outlined),
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).changeTheNameOfTheGroup),
|
L10n.of(context).changeTheNameOfTheGroup),
|
||||||
@ -167,7 +167,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.link_outlined),
|
child: const Icon(Icons.link_outlined),
|
||||||
),
|
),
|
||||||
onTap: controller.editAliases,
|
onTap: controller.editAliases,
|
||||||
title: Text(L10n.of(context).editRoomAliases),
|
title: Text(L10n.of(context).editRoomAliases),
|
||||||
@ -181,7 +181,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.insert_emoticon_outlined),
|
child: const Icon(Icons.insert_emoticon_outlined),
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).emoteSettings),
|
title: Text(L10n.of(context).emoteSettings),
|
||||||
subtitle: Text(L10n.of(context).setCustomEmotes),
|
subtitle: Text(L10n.of(context).setCustomEmotes),
|
||||||
@ -211,7 +211,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.scaffoldBackgroundColor,
|
.scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.public_outlined)),
|
child: const Icon(Icons.public_outlined)),
|
||||||
title: Text(L10n.of(context)
|
title: Text(L10n.of(context)
|
||||||
.whoIsAllowedToJoinThisGroup),
|
.whoIsAllowedToJoinThisGroup),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
@ -258,7 +258,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.visibility_outlined),
|
child: const Icon(Icons.visibility_outlined),
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context)
|
title: Text(L10n.of(context)
|
||||||
.visibilityOfTheChatHistory),
|
.visibilityOfTheChatHistory),
|
||||||
@ -297,7 +297,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor: Theme.of(context)
|
backgroundColor: Theme.of(context)
|
||||||
.scaffoldBackgroundColor,
|
.scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.info_outline),
|
child: const Icon(Icons.info_outline),
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).areGuestsAllowedToJoin),
|
L10n.of(context).areGuestsAllowedToJoin),
|
||||||
@ -315,12 +315,12 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.edit_attributes_outlined),
|
child: const Icon(Icons.edit_attributes_outlined),
|
||||||
),
|
),
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
VRouter.of(context).to('permissions'),
|
VRouter.of(context).to('permissions'),
|
||||||
),
|
),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
actualMembersCount > 1
|
actualMembersCount > 1
|
||||||
@ -342,7 +342,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
Theme.of(context).primaryColor,
|
Theme.of(context).primaryColor,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
radius: Avatar.defaultSize / 2,
|
radius: Avatar.defaultSize / 2,
|
||||||
child: Icon(Icons.add_outlined),
|
child: const Icon(Icons.add_outlined),
|
||||||
),
|
),
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
VRouter.of(context).to('invite'),
|
VRouter.of(context).to('invite'),
|
||||||
@ -361,7 +361,7 @@ class ChatDetailsView extends StatelessWidget {
|
|||||||
leading: CircleAvatar(
|
leading: CircleAvatar(
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
child: Icon(
|
child: const Icon(
|
||||||
Icons.refresh,
|
Icons.refresh,
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
),
|
),
|
||||||
|
@ -21,19 +21,19 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).toSegments(['rooms', controller.roomId]),
|
VRouter.of(context).toSegments(['rooms', controller.roomId]),
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).tapOnDeviceToVerify),
|
title: Text(L10n.of(context).tapOnDeviceToVerify),
|
||||||
bottom: PreferredSize(
|
bottom: PreferredSize(
|
||||||
preferredSize: Size.fromHeight(56),
|
preferredSize: const Size.fromHeight(56),
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
title: Text(L10n.of(context).deviceVerifyDescription),
|
title: Text(L10n.of(context).deviceVerifyDescription),
|
||||||
leading: CircleAvatar(
|
leading: CircleAvatar(
|
||||||
backgroundColor: Theme.of(context).secondaryHeaderColor,
|
backgroundColor: Theme.of(context).secondaryHeaderColor,
|
||||||
foregroundColor: Theme.of(context).colorScheme.secondary,
|
foregroundColor: Theme.of(context).colorScheme.secondary,
|
||||||
child: Icon(Icons.lock),
|
child: const Icon(Icons.lock),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -54,14 +54,14 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child:
|
child:
|
||||||
CircularProgressIndicator.adaptive(strokeWidth: 2));
|
CircularProgressIndicator.adaptive(strokeWidth: 2));
|
||||||
}
|
}
|
||||||
final deviceKeys = snapshot.data;
|
final deviceKeys = snapshot.data;
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
itemCount: deviceKeys.length,
|
itemCount: deviceKeys.length,
|
||||||
itemBuilder: (BuildContext context, int i) => Column(
|
itemBuilder: (BuildContext context, int i) => Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
@ -69,7 +69,7 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
|||||||
if (i == 0 ||
|
if (i == 0 ||
|
||||||
deviceKeys[i].userId !=
|
deviceKeys[i].userId !=
|
||||||
deviceKeys[i - 1].userId) ...{
|
deviceKeys[i - 1].userId) ...{
|
||||||
Divider(height: 1, thickness: 1),
|
const Divider(height: 1, thickness: 1),
|
||||||
PopupMenuButton(
|
PopupMenuButton(
|
||||||
onSelected: (action) => controller.onSelected(
|
onSelected: (action) => controller.onSelected(
|
||||||
context, action, deviceKeys[i]),
|
context, action, deviceKeys[i]),
|
||||||
@ -103,7 +103,7 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
deviceKeys[i].userId,
|
deviceKeys[i].userId,
|
||||||
style: TextStyle(fontWeight: FontWeight.w300),
|
style: const TextStyle(fontWeight: FontWeight.w300),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -152,9 +152,9 @@ class ChatEncryptionSettingsView extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
deviceKeys[i].deviceId,
|
deviceKeys[i].deviceId,
|
||||||
style: TextStyle(fontWeight: FontWeight.w300),
|
style: const TextStyle(fontWeight: FontWeight.w300),
|
||||||
),
|
),
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
Text(
|
Text(
|
||||||
deviceKeys[i].blocked
|
deviceKeys[i].blocked
|
||||||
? L10n.of(context).blocked
|
? L10n.of(context).blocked
|
||||||
|
@ -101,12 +101,12 @@ class ChatListView extends StatelessWidget {
|
|||||||
? null
|
? null
|
||||||
: Builder(
|
: Builder(
|
||||||
builder: (context) => IconButton(
|
builder: (context) => IconButton(
|
||||||
icon: Icon(Icons.group_work_outlined),
|
icon: const Icon(Icons.group_work_outlined),
|
||||||
onPressed: Scaffold.of(context).openDrawer,
|
onPressed: Scaffold.of(context).openDrawer,
|
||||||
))
|
))
|
||||||
: IconButton(
|
: IconButton(
|
||||||
tooltip: L10n.of(context).cancel,
|
tooltip: L10n.of(context).cancel,
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: controller.cancelAction,
|
onPressed: controller.cancelAction,
|
||||||
color: Theme.of(context).colorScheme.primary,
|
color: Theme.of(context).colorScheme.primary,
|
||||||
),
|
),
|
||||||
@ -125,7 +125,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
.isDirectChat)
|
.isDirectChat)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: L10n.of(context).addToSpace,
|
tooltip: L10n.of(context).addToSpace,
|
||||||
icon: Icon(Icons.group_work_outlined),
|
icon: const Icon(Icons.group_work_outlined),
|
||||||
onPressed: controller.addOrRemoveToSpace,
|
onPressed: controller.addOrRemoveToSpace,
|
||||||
),
|
),
|
||||||
if (controller.selectedRoomIds.length == 1)
|
if (controller.selectedRoomIds.length == 1)
|
||||||
@ -143,7 +143,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
if (controller.selectedRoomIds.length == 1)
|
if (controller.selectedRoomIds.length == 1)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: L10n.of(context).toggleFavorite,
|
tooltip: L10n.of(context).toggleFavorite,
|
||||||
icon: Icon(Icons.push_pin_outlined),
|
icon: const Icon(Icons.push_pin_outlined),
|
||||||
onPressed: controller.toggleFavouriteRoom,
|
onPressed: controller.toggleFavouriteRoom,
|
||||||
),
|
),
|
||||||
if (controller.selectedRoomIds.length == 1)
|
if (controller.selectedRoomIds.length == 1)
|
||||||
@ -160,14 +160,14 @@ class ChatListView extends StatelessWidget {
|
|||||||
onPressed: controller.toggleMuted,
|
onPressed: controller.toggleMuted,
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.delete_outlined),
|
icon: const Icon(Icons.delete_outlined),
|
||||||
tooltip: L10n.of(context).archive,
|
tooltip: L10n.of(context).archive,
|
||||||
onPressed: controller.archiveAction,
|
onPressed: controller.archiveAction,
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
: [
|
: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.search_outlined),
|
icon: const Icon(Icons.search_outlined),
|
||||||
tooltip: L10n.of(context).search,
|
tooltip: L10n.of(context).search,
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).to('/search'),
|
VRouter.of(context).to('/search'),
|
||||||
@ -180,8 +180,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.edit_outlined),
|
const Icon(Icons.edit_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).setStatus),
|
Text(L10n.of(context).setStatus),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -191,8 +191,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.group_add_outlined),
|
const Icon(Icons.group_add_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).createNewGroup),
|
Text(L10n.of(context).createNewGroup),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -202,8 +202,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.group_work_outlined),
|
const Icon(Icons.group_work_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).createNewSpace),
|
Text(L10n.of(context).createNewSpace),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -213,8 +213,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.share_outlined),
|
const Icon(Icons.share_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).inviteContact),
|
Text(L10n.of(context).inviteContact),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -224,8 +224,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.archive_outlined),
|
const Icon(Icons.archive_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).archive),
|
Text(L10n.of(context).archive),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -235,8 +235,8 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.settings_outlined),
|
const Icon(Icons.settings_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).settings),
|
Text(L10n.of(context).settings),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -256,7 +256,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
.displayname),
|
.displayname),
|
||||||
),
|
),
|
||||||
body: Column(children: [
|
body: Column(children: [
|
||||||
ConnectionStatusHeader(),
|
const ConnectionStatusHeader(),
|
||||||
Expanded(child: _ChatListViewBody(controller)),
|
Expanded(child: _ChatListViewBody(controller)),
|
||||||
]),
|
]),
|
||||||
floatingActionButton: selectMode == SelectMode.normal
|
floatingActionButton: selectMode == SelectMode.normal
|
||||||
@ -265,14 +265,14 @@ class ChatListView extends StatelessWidget {
|
|||||||
heroTag: 'main_fab',
|
heroTag: 'main_fab',
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).to('/newprivatechat'),
|
VRouter.of(context).to('/newprivatechat'),
|
||||||
icon: Icon(CupertinoIcons.chat_bubble),
|
icon: const Icon(CupertinoIcons.chat_bubble),
|
||||||
label: Text(L10n.of(context).newChat),
|
label: Text(L10n.of(context).newChat),
|
||||||
)
|
)
|
||||||
: FloatingActionButton(
|
: FloatingActionButton(
|
||||||
heroTag: 'main_fab',
|
heroTag: 'main_fab',
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).to('/newprivatechat'),
|
VRouter.of(context).to('/newprivatechat'),
|
||||||
child: Icon(CupertinoIcons.chat_bubble),
|
child: const Icon(CupertinoIcons.chat_bubble),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
bottomNavigationBar: Matrix.of(context).isMultiAccount
|
bottomNavigationBar: Matrix.of(context).isMultiAccount
|
||||||
@ -291,7 +291,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
Builder(builder: (context) {
|
Builder(builder: (context) {
|
||||||
final items = getBottomBarItems(context);
|
final items = getBottomBarItems(context);
|
||||||
if (items.length == 1) {
|
if (items.length == 1) {
|
||||||
@ -378,7 +378,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).primaryColor,
|
Theme.of(context).primaryColor,
|
||||||
radius: Avatar.defaultSize / 2,
|
radius: Avatar.defaultSize / 2,
|
||||||
child: Icon(Icons.home_outlined),
|
child: const Icon(Icons.home_outlined),
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).allChats),
|
title: Text(L10n.of(context).allChats),
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
@ -399,7 +399,7 @@ class ChatListView extends StatelessWidget {
|
|||||||
onTap: () => controller.setActiveSpaceId(
|
onTap: () => controller.setActiveSpaceId(
|
||||||
context, space.id),
|
context, space.id),
|
||||||
trailing: IconButton(
|
trailing: IconButton(
|
||||||
icon: Icon(Icons.edit_outlined),
|
icon: const Icon(Icons.edit_outlined),
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
controller.editSpace(context, space.id),
|
controller.editSpace(context, space.id),
|
||||||
),
|
),
|
||||||
@ -425,7 +425,7 @@ class _ChatListViewBody extends StatelessWidget {
|
|||||||
.onSync
|
.onSync
|
||||||
.stream
|
.stream
|
||||||
.where((s) => s.hasRoomUpdate)
|
.where((s) => s.hasRoomUpdate)
|
||||||
.rateLimit(Duration(seconds: 1)),
|
.rateLimit(const Duration(seconds: 1)),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
return FutureBuilder<void>(
|
return FutureBuilder<void>(
|
||||||
future: controller.waitForFirstSync(),
|
future: controller.waitForFirstSync(),
|
||||||
@ -441,7 +441,7 @@ class _ChatListViewBody extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(
|
const Icon(
|
||||||
Icons.maps_ugc_outlined,
|
Icons.maps_ugc_outlined,
|
||||||
size: 80,
|
size: 80,
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
@ -450,7 +450,7 @@ class _ChatListViewBody extends StatelessWidget {
|
|||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).startYourFirstChat,
|
L10n.of(context).startYourFirstChat,
|
||||||
textAlign: TextAlign.start,
|
textAlign: TextAlign.start,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
),
|
),
|
||||||
|
@ -21,7 +21,7 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
leading: VRouter.of(context).path.startsWith('/spaces/')
|
leading: VRouter.of(context).path.startsWith('/spaces/')
|
||||||
? null
|
? null
|
||||||
: IconButton(
|
: IconButton(
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: () => VRouter.of(context)
|
onPressed: () => VRouter.of(context)
|
||||||
.toSegments(['rooms', controller.roomId]),
|
.toSegments(['rooms', controller.roomId]),
|
||||||
),
|
),
|
||||||
@ -37,10 +37,10 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
final powerLevelsContent = Map<String, dynamic>.from(
|
final powerLevelsContent = Map<String, dynamic>.from(
|
||||||
room.getState(EventTypes.RoomPowerLevels).content);
|
room.getState(EventTypes.RoomPowerLevels).content);
|
||||||
final powerLevels = Map<String, dynamic>.from(powerLevelsContent)
|
final powerLevels = Map<String, dynamic>.from(powerLevelsContent)
|
||||||
..removeWhere((k, v) => !(v is int));
|
..removeWhere((k, v) => v is! int);
|
||||||
final eventsPowerLevels =
|
final eventsPowerLevels =
|
||||||
Map<String, dynamic>.from(powerLevelsContent['events'] ?? {})
|
Map<String, dynamic>.from(powerLevelsContent['events'] ?? {})
|
||||||
..removeWhere((k, v) => !(v is int));
|
..removeWhere((k, v) => v is! int);
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
Column(
|
Column(
|
||||||
@ -53,7 +53,7 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
onTap: () => controller.editPowerLevel(
|
onTap: () => controller.editPowerLevel(
|
||||||
context, entry.key, entry.value),
|
context, entry.key, entry.value),
|
||||||
),
|
),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).notifications,
|
L10n.of(context).notifications,
|
||||||
@ -64,7 +64,7 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
Builder(builder: (context) {
|
Builder(builder: (context) {
|
||||||
final key = 'rooms';
|
const key = 'rooms';
|
||||||
final int value = powerLevelsContent
|
final int value = powerLevelsContent
|
||||||
.containsKey('notifications')
|
.containsKey('notifications')
|
||||||
? powerLevelsContent['notifications']['rooms'] ?? 0
|
? powerLevelsContent['notifications']['rooms'] ?? 0
|
||||||
@ -78,7 +78,7 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
category: 'notifications'),
|
category: 'notifications'),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).configureChat,
|
L10n.of(context).configureChat,
|
||||||
@ -99,12 +99,12 @@ class ChatPermissionsSettingsView extends StatelessWidget {
|
|||||||
category: 'events'),
|
category: 'events'),
|
||||||
),
|
),
|
||||||
if (room.canSendEvent(EventTypes.RoomTombstone)) ...{
|
if (room.canSendEvent(EventTypes.RoomTombstone)) ...{
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
FutureBuilder<Capabilities>(
|
FutureBuilder<Capabilities>(
|
||||||
future: room.client.getCapabilities(),
|
future: room.client.getCapabilities(),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(
|
child: CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2));
|
strokeWidth: 2));
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ class ChatView extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
child: StreamBuilder(
|
child: StreamBuilder(
|
||||||
stream: controller.room.onUpdate.stream
|
stream: controller.room.onUpdate.stream
|
||||||
.rateLimit(Duration(milliseconds: 250)),
|
.rateLimit(const Duration(milliseconds: 250)),
|
||||||
builder: (context, snapshot) => Scaffold(
|
builder: (context, snapshot) => Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
actionsIconTheme: IconThemeData(
|
actionsIconTheme: IconThemeData(
|
||||||
@ -76,7 +76,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
leading: controller.selectMode
|
leading: controller.selectMode
|
||||||
? IconButton(
|
? IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: controller.clearSelectedEvents,
|
onPressed: controller.clearSelectedEvents,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
color: Theme.of(context).colorScheme.primary,
|
color: Theme.of(context).colorScheme.primary,
|
||||||
@ -117,7 +117,7 @@ class ChatView extends StatelessWidget {
|
|||||||
.where((p) =>
|
.where((p) =>
|
||||||
p.senderId ==
|
p.senderId ==
|
||||||
controller.room.directChatMatrixID)
|
controller.room.directChatMatrixID)
|
||||||
.rateLimit(Duration(seconds: 1)),
|
.rateLimit(const Duration(seconds: 1)),
|
||||||
builder: (context, snapshot) => Text(
|
builder: (context, snapshot) => Text(
|
||||||
controller.room.getLocalizedStatus(context),
|
controller.room.getLocalizedStatus(context),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
@ -129,7 +129,7 @@ class ChatView extends StatelessWidget {
|
|||||||
color:
|
color:
|
||||||
Theme.of(context).colorScheme.secondary,
|
Theme.of(context).colorScheme.secondary,
|
||||||
size: 13),
|
size: 13),
|
||||||
SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
controller.room
|
controller.room
|
||||||
@ -150,24 +150,24 @@ class ChatView extends StatelessWidget {
|
|||||||
? <Widget>[
|
? <Widget>[
|
||||||
if (controller.canEditSelectedEvents)
|
if (controller.canEditSelectedEvents)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.edit_outlined),
|
icon: const Icon(Icons.edit_outlined),
|
||||||
tooltip: L10n.of(context).edit,
|
tooltip: L10n.of(context).edit,
|
||||||
onPressed: controller.editSelectedEventAction,
|
onPressed: controller.editSelectedEventAction,
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.copy_outlined),
|
icon: const Icon(Icons.copy_outlined),
|
||||||
tooltip: L10n.of(context).copy,
|
tooltip: L10n.of(context).copy,
|
||||||
onPressed: controller.copyEventsAction,
|
onPressed: controller.copyEventsAction,
|
||||||
),
|
),
|
||||||
if (controller.selectedEvents.length == 1)
|
if (controller.selectedEvents.length == 1)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.report_outlined),
|
icon: const Icon(Icons.report_outlined),
|
||||||
tooltip: L10n.of(context).reportMessage,
|
tooltip: L10n.of(context).reportMessage,
|
||||||
onPressed: controller.reportEventAction,
|
onPressed: controller.reportEventAction,
|
||||||
),
|
),
|
||||||
if (controller.canRedactSelectedEvents)
|
if (controller.canRedactSelectedEvents)
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.delete_outlined),
|
icon: const Icon(Icons.delete_outlined),
|
||||||
tooltip: L10n.of(context).redactMessage,
|
tooltip: L10n.of(context).redactMessage,
|
||||||
onPressed: controller.redactEventsAction,
|
onPressed: controller.redactEventsAction,
|
||||||
),
|
),
|
||||||
@ -176,7 +176,7 @@ class ChatView extends StatelessWidget {
|
|||||||
if (controller.room.canSendDefaultStates)
|
if (controller.room.canSendDefaultStates)
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: L10n.of(context).videoCall,
|
tooltip: L10n.of(context).videoCall,
|
||||||
icon: Icon(Icons.video_call_outlined),
|
icon: const Icon(Icons.video_call_outlined),
|
||||||
onPressed: controller.startCallAction,
|
onPressed: controller.startCallAction,
|
||||||
),
|
),
|
||||||
ChatSettingsPopupMenu(
|
ChatSettingsPopupMenu(
|
||||||
@ -211,7 +211,7 @@ class ChatView extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (controller.room.getState(EventTypes.RoomTombstone) !=
|
if (controller.room.getState(EventTypes.RoomTombstone) !=
|
||||||
null)
|
null)
|
||||||
Container(
|
SizedBox(
|
||||||
height: 72,
|
height: 72,
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
@ -222,7 +222,7 @@ class ChatView extends StatelessWidget {
|
|||||||
Theme.of(context).colorScheme.secondary,
|
Theme.of(context).colorScheme.secondary,
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).backgroundColor,
|
Theme.of(context).backgroundColor,
|
||||||
child: Icon(Icons.upgrade_outlined),
|
child: const Icon(Icons.upgrade_outlined),
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
controller.room
|
controller.room
|
||||||
@ -242,7 +242,7 @@ class ChatView extends StatelessWidget {
|
|||||||
future: controller.getTimeline(),
|
future: controller.getTimeline(),
|
||||||
builder: (BuildContext context, snapshot) {
|
builder: (BuildContext context, snapshot) {
|
||||||
if (controller.timeline == null) {
|
if (controller.timeline == null) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(
|
child: CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2),
|
strokeWidth: 2),
|
||||||
);
|
);
|
||||||
@ -266,7 +266,7 @@ class ChatView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return ListView.custom(
|
return ListView.custom(
|
||||||
padding: EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
top: 16,
|
top: 16,
|
||||||
bottom: 4,
|
bottom: 4,
|
||||||
),
|
),
|
||||||
@ -279,7 +279,7 @@ class ChatView extends StatelessWidget {
|
|||||||
(BuildContext context, int i) {
|
(BuildContext context, int i) {
|
||||||
return i == controller.filteredEvents.length + 1
|
return i == controller.filteredEvents.length + 1
|
||||||
? controller.timeline.isRequestingHistory
|
? controller.timeline.isRequestingHistory
|
||||||
? Center(
|
? const Center(
|
||||||
child: CircularProgressIndicator
|
child: CircularProgressIndicator
|
||||||
.adaptive(strokeWidth: 2),
|
.adaptive(strokeWidth: 2),
|
||||||
)
|
)
|
||||||
@ -303,8 +303,8 @@ class ChatView extends StatelessWidget {
|
|||||||
? AnimatedContainer(
|
? AnimatedContainer(
|
||||||
height: seenByText.isEmpty ? 0 : 24,
|
height: seenByText.isEmpty ? 0 : 24,
|
||||||
duration: seenByText.isEmpty
|
duration: seenByText.isEmpty
|
||||||
? Duration(milliseconds: 0)
|
? const Duration(milliseconds: 0)
|
||||||
: Duration(milliseconds: 300),
|
: const Duration(milliseconds: 300),
|
||||||
alignment: controller.filteredEvents
|
alignment: controller.filteredEvents
|
||||||
.isNotEmpty &&
|
.isNotEmpty &&
|
||||||
controller.filteredEvents
|
controller.filteredEvents
|
||||||
@ -312,13 +312,13 @@ class ChatView extends StatelessWidget {
|
|||||||
client.userID
|
client.userID
|
||||||
? Alignment.topRight
|
? Alignment.topRight
|
||||||
: Alignment.topLeft,
|
: Alignment.topLeft,
|
||||||
padding: EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
left: 8,
|
left: 8,
|
||||||
right: 8,
|
right: 8,
|
||||||
bottom: 8,
|
bottom: 8,
|
||||||
),
|
),
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: 4),
|
horizontal: 4),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context)
|
color: Theme.of(context)
|
||||||
@ -349,7 +349,7 @@ class ChatView extends StatelessWidget {
|
|||||||
key: ValueKey(controller
|
key: ValueKey(controller
|
||||||
.filteredEvents[i - 1]
|
.filteredEvents[i - 1]
|
||||||
.eventId),
|
.eventId),
|
||||||
background: Padding(
|
background: const Padding(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: EdgeInsets.symmetric(
|
||||||
horizontal: 12.0),
|
horizontal: 12.0),
|
||||||
child: Center(
|
child: Center(
|
||||||
@ -409,10 +409,10 @@ class ChatView extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ConnectionStatusHeader(),
|
const ConnectionStatusHeader(),
|
||||||
if (!controller.showEmojiPicker)
|
if (!controller.showEmojiPicker)
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
height: (controller.editEvent == null &&
|
height: (controller.editEvent == null &&
|
||||||
controller.replyEvent == null &&
|
controller.replyEvent == null &&
|
||||||
controller.room.canSendDefaultMessages &&
|
controller.room.canSendDefaultMessages &&
|
||||||
@ -437,12 +437,12 @@ class ChatView extends StatelessWidget {
|
|||||||
event.room.client.userID &&
|
event.room.client.userID &&
|
||||||
event.type == 'm.reaction');
|
event.type == 'm.reaction');
|
||||||
|
|
||||||
allReactionEvents.forEach((event) {
|
for (final event in allReactionEvents) {
|
||||||
try {
|
try {
|
||||||
emojis.remove(
|
emojis.remove(
|
||||||
event.content['m.relates_to']['key']);
|
event.content['m.relates_to']['key']);
|
||||||
} catch (_) {}
|
} catch (_) {}
|
||||||
});
|
}
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
scrollDirection: Axis.horizontal,
|
scrollDirection: Axis.horizontal,
|
||||||
itemCount: emojis.length + 1,
|
itemCount: emojis.length + 1,
|
||||||
@ -455,7 +455,7 @@ class ChatView extends StatelessWidget {
|
|||||||
width: 56,
|
width: 56,
|
||||||
height: 56,
|
height: 56,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Icon(Icons.add_outlined),
|
child: const Icon(Icons.add_outlined),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: InkWell(
|
: InkWell(
|
||||||
@ -468,7 +468,7 @@ class ChatView extends StatelessWidget {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: Text(
|
child: Text(
|
||||||
emojis[i],
|
emojis[i],
|
||||||
style: TextStyle(fontSize: 30),
|
style: const TextStyle(fontSize: 30),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -477,7 +477,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
height: controller.editEvent != null ||
|
height: controller.editEvent != null ||
|
||||||
controller.replyEvent != null
|
controller.replyEvent != null
|
||||||
? 56
|
? 56
|
||||||
@ -488,7 +488,7 @@ class ChatView extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: controller.cancelReplyEventAction,
|
onPressed: controller.cancelReplyEventAction,
|
||||||
),
|
),
|
||||||
Expanded(
|
Expanded(
|
||||||
@ -502,7 +502,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
if (controller.room.canSendDefaultMessages &&
|
if (controller.room.canSendDefaultMessages &&
|
||||||
controller.room.membership == Membership.join &&
|
controller.room.membership == Membership.join &&
|
||||||
!controller.showEmojiPicker)
|
!controller.showEmojiPicker)
|
||||||
@ -515,13 +515,13 @@ class ChatView extends StatelessWidget {
|
|||||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
children: controller.selectMode
|
children: controller.selectMode
|
||||||
? <Widget>[
|
? <Widget>[
|
||||||
Container(
|
SizedBox(
|
||||||
height: 56,
|
height: 56,
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
onPressed: controller.forwardEventsAction,
|
onPressed: controller.forwardEventsAction,
|
||||||
child: Row(
|
child: Row(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(Icons
|
const Icon(Icons
|
||||||
.keyboard_arrow_left_outlined),
|
.keyboard_arrow_left_outlined),
|
||||||
Text(L10n.of(context).forward),
|
Text(L10n.of(context).forward),
|
||||||
],
|
],
|
||||||
@ -534,7 +534,7 @@ class ChatView extends StatelessWidget {
|
|||||||
controller.timeline)
|
controller.timeline)
|
||||||
.status >
|
.status >
|
||||||
0
|
0
|
||||||
? Container(
|
? SizedBox(
|
||||||
height: 56,
|
height: 56,
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
onPressed:
|
onPressed:
|
||||||
@ -543,13 +543,13 @@ class ChatView extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(
|
Text(
|
||||||
L10n.of(context).reply),
|
L10n.of(context).reply),
|
||||||
Icon(Icons
|
const Icon(Icons
|
||||||
.keyboard_arrow_right),
|
.keyboard_arrow_right),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: Container(
|
: SizedBox(
|
||||||
height: 56,
|
height: 56,
|
||||||
child: TextButton(
|
child: TextButton(
|
||||||
onPressed:
|
onPressed:
|
||||||
@ -558,8 +558,8 @@ class ChatView extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(L10n.of(context)
|
Text(L10n.of(context)
|
||||||
.tryToSendAgain),
|
.tryToSendAgain),
|
||||||
SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Icon(Icons.send_outlined,
|
const Icon(Icons.send_outlined,
|
||||||
size: 16),
|
size: 16),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -569,15 +569,15 @@ class ChatView extends StatelessWidget {
|
|||||||
]
|
]
|
||||||
: <Widget>[
|
: <Widget>[
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 200),
|
duration: const Duration(milliseconds: 200),
|
||||||
height: 56,
|
height: 56,
|
||||||
width:
|
width:
|
||||||
controller.inputText.isEmpty ? 56 : 0,
|
controller.inputText.isEmpty ? 56 : 0,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
decoration: BoxDecoration(),
|
decoration: const BoxDecoration(),
|
||||||
child: PopupMenuButton<String>(
|
child: PopupMenuButton<String>(
|
||||||
icon: Icon(Icons.add_outlined),
|
icon: const Icon(Icons.add_outlined),
|
||||||
onSelected: controller
|
onSelected: controller
|
||||||
.onAddPopupMenuButtonSelected,
|
.onAddPopupMenuButtonSelected,
|
||||||
itemBuilder: (BuildContext context) =>
|
itemBuilder: (BuildContext context) =>
|
||||||
@ -585,7 +585,7 @@ class ChatView extends StatelessWidget {
|
|||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'file',
|
value: 'file',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.green,
|
backgroundColor: Colors.green,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
@ -593,27 +593,27 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title:
|
title:
|
||||||
Text(L10n.of(context).sendFile),
|
Text(L10n.of(context).sendFile),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'image',
|
value: 'image',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.blue,
|
backgroundColor: Colors.blue,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(Icons.image_outlined),
|
child: Icon(Icons.image_outlined),
|
||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).sendImage),
|
L10n.of(context).sendImage),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (PlatformInfos.isMobile)
|
if (PlatformInfos.isMobile)
|
||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'camera',
|
value: 'camera',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.purple,
|
backgroundColor: Colors.purple,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
@ -621,7 +621,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).openCamera),
|
L10n.of(context).openCamera),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (controller.room
|
if (controller.room
|
||||||
@ -631,7 +631,7 @@ class ChatView extends StatelessWidget {
|
|||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'sticker',
|
value: 'sticker',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.orange,
|
backgroundColor: Colors.orange,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(Icons
|
child: Icon(Icons
|
||||||
@ -639,14 +639,14 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).sendSticker),
|
L10n.of(context).sendSticker),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (PlatformInfos.isMobile)
|
if (PlatformInfos.isMobile)
|
||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'voice',
|
value: 'voice',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.red,
|
backgroundColor: Colors.red,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
@ -654,14 +654,14 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title: Text(L10n.of(context)
|
title: Text(L10n.of(context)
|
||||||
.voiceMessage),
|
.voiceMessage),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (PlatformInfos.isMobile)
|
if (PlatformInfos.isMobile)
|
||||||
PopupMenuItem<String>(
|
PopupMenuItem<String>(
|
||||||
value: 'location',
|
value: 'location',
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: CircleAvatar(
|
leading: const CircleAvatar(
|
||||||
backgroundColor: Colors.brown,
|
backgroundColor: Colors.brown,
|
||||||
foregroundColor: Colors.white,
|
foregroundColor: Colors.white,
|
||||||
child: Icon(
|
child: Icon(
|
||||||
@ -669,7 +669,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title: Text(L10n.of(context)
|
title: Text(L10n.of(context)
|
||||||
.shareLocation),
|
.shareLocation),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -725,7 +725,7 @@ class ChatView extends StatelessWidget {
|
|||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
tooltip: L10n.of(context).voiceMessage,
|
tooltip: L10n.of(context).voiceMessage,
|
||||||
icon: Icon(Icons.mic_none_outlined),
|
icon: const Icon(Icons.mic_none_outlined),
|
||||||
onPressed:
|
onPressed:
|
||||||
controller.voiceMessageAction,
|
controller.voiceMessageAction,
|
||||||
),
|
),
|
||||||
@ -736,7 +736,7 @@ class ChatView extends StatelessWidget {
|
|||||||
height: 56,
|
height: 56,
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
icon: Icon(Icons.send_outlined),
|
icon: const Icon(Icons.send_outlined),
|
||||||
onPressed: controller.send,
|
onPressed: controller.send,
|
||||||
tooltip: L10n.of(context).send,
|
tooltip: L10n.of(context).send,
|
||||||
),
|
),
|
||||||
@ -745,7 +745,7 @@ class ChatView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
height: controller.showEmojiPicker
|
height: controller.showEmojiPicker
|
||||||
? MediaQuery.of(context).size.height / 2
|
? MediaQuery.of(context).size.height / 2
|
||||||
: 0,
|
: 0,
|
||||||
@ -770,7 +770,7 @@ class ChatView extends StatelessWidget {
|
|||||||
class _EditContent extends StatelessWidget {
|
class _EditContent extends StatelessWidget {
|
||||||
final Event event;
|
final Event event;
|
||||||
|
|
||||||
_EditContent(this.event);
|
const _EditContent(this.event);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -840,7 +840,7 @@ class _ChatAccountPicker extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
title:
|
title:
|
||||||
Text(snapshot.data?.displayName ?? client.userID),
|
Text(snapshot.data?.displayName ?? client.userID),
|
||||||
contentPadding: EdgeInsets.all(0),
|
contentPadding: const EdgeInsets.all(0),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
))
|
))
|
||||||
|
@ -14,7 +14,7 @@ class DevicesSettingsView extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).devices),
|
title: Text(L10n.of(context).devices),
|
||||||
),
|
),
|
||||||
body: MaxWidthBody(
|
body: MaxWidthBody(
|
||||||
@ -26,14 +26,14 @@ class DevicesSettingsView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Icon(Icons.error_outlined),
|
const Icon(Icons.error_outlined),
|
||||||
Text(snapshot.error.toString()),
|
Text(snapshot.error.toString()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!snapshot.hasData || controller.devices == null) {
|
if (!snapshot.hasData || controller.devices == null) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
||||||
}
|
}
|
||||||
return Column(
|
return Column(
|
||||||
@ -47,23 +47,23 @@ class DevicesSettingsView extends StatelessWidget {
|
|||||||
block: controller.blockDeviceAction,
|
block: controller.blockDeviceAction,
|
||||||
unblock: controller.unblockDeviceAction,
|
unblock: controller.unblockDeviceAction,
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
if (controller.notThisDevice.isNotEmpty)
|
if (controller.notThisDevice.isNotEmpty)
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
controller.errorDeletingDevices ??
|
controller.errorDeletingDevices ??
|
||||||
L10n.of(context).removeAllOtherDevices,
|
L10n.of(context).removeAllOtherDevices,
|
||||||
style: TextStyle(color: Colors.red),
|
style: const TextStyle(color: Colors.red),
|
||||||
),
|
),
|
||||||
trailing: controller.loadingDeletingDevices
|
trailing: controller.loadingDeletingDevices
|
||||||
? CircularProgressIndicator.adaptive(strokeWidth: 2)
|
? const CircularProgressIndicator.adaptive(strokeWidth: 2)
|
||||||
: Icon(Icons.delete_outline),
|
: const Icon(Icons.delete_outline),
|
||||||
onTap: controller.loadingDeletingDevices
|
onTap: controller.loadingDeletingDevices
|
||||||
? null
|
? null
|
||||||
: () => controller
|
: () => controller
|
||||||
.removeDevicesAction(controller.notThisDevice),
|
.removeDevicesAction(controller.notThisDevice),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: controller.notThisDevice.isEmpty
|
child: controller.notThisDevice.isEmpty
|
||||||
? Center(
|
? Center(
|
||||||
@ -75,7 +75,7 @@ class DevicesSettingsView extends StatelessWidget {
|
|||||||
)
|
)
|
||||||
: ListView.separated(
|
: ListView.separated(
|
||||||
separatorBuilder: (BuildContext context, int i) =>
|
separatorBuilder: (BuildContext context, int i) =>
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
itemCount: controller.notThisDevice.length,
|
itemCount: controller.notThisDevice.length,
|
||||||
itemBuilder: (BuildContext context, int i) =>
|
itemBuilder: (BuildContext context, int i) =>
|
||||||
UserDeviceListItem(
|
UserDeviceListItem(
|
||||||
|
@ -34,7 +34,7 @@ class EmptyPage extends StatelessWidget {
|
|||||||
Center(
|
Center(
|
||||||
child: SizedBox(
|
child: SizedBox(
|
||||||
width: _width,
|
width: _width,
|
||||||
child: LinearProgressIndicator(),
|
child: const LinearProgressIndicator(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -32,7 +32,7 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
prefixText: 'https://',
|
prefixText: 'https://',
|
||||||
hintText: L10n.of(context).enterYourHomeserver,
|
hintText: L10n.of(context).enterYourHomeserver,
|
||||||
searchController: controller.homeserverController,
|
searchController: controller.homeserverController,
|
||||||
suffix: Icon(Icons.edit_outlined),
|
suffix: const Icon(Icons.edit_outlined),
|
||||||
padding: EdgeInsets.zero,
|
padding: EdgeInsets.zero,
|
||||||
onChanged: controller.setDomain,
|
onChanged: controller.setDomain,
|
||||||
readOnly: !AppConfig.allowOtherHomeservers,
|
readOnly: !AppConfig.allowOtherHomeservers,
|
||||||
@ -44,12 +44,12 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
elevation: 0,
|
elevation: 0,
|
||||||
),
|
),
|
||||||
body: ListView(children: [
|
body: ListView(children: [
|
||||||
Hero(
|
const Hero(
|
||||||
tag: 'loginBanner',
|
tag: 'loginBanner',
|
||||||
child: FluffyBanner(),
|
child: FluffyBanner(),
|
||||||
),
|
),
|
||||||
controller.isLoading
|
controller.isLoading
|
||||||
? Center(
|
? const Center(
|
||||||
child: CircularProgressIndicator.adaptive(strokeWidth: 2))
|
child: CircularProgressIndicator.adaptive(strokeWidth: 2))
|
||||||
: controller.error != null
|
: controller.error != null
|
||||||
? Center(
|
? Center(
|
||||||
@ -77,7 +77,7 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(
|
child: CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2));
|
strokeWidth: 2));
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
onPressed: () => controller
|
onPressed: () => controller
|
||||||
.ssoLoginAction(identityProvider.id),
|
.ssoLoginAction(identityProvider.id),
|
||||||
icon: identityProvider.icon == null
|
icon: identityProvider.icon == null
|
||||||
? Icon(Icons.web_outlined)
|
? const Icon(Icons.web_outlined)
|
||||||
: CachedNetworkImage(
|
: CachedNetworkImage(
|
||||||
imageUrl: Uri.parse(
|
imageUrl: Uri.parse(
|
||||||
identityProvider.icon)
|
identityProvider.icon)
|
||||||
@ -118,12 +118,12 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
if (controller.registrationSupported ||
|
if (controller.registrationSupported ||
|
||||||
controller.passwordLoginSupported)
|
controller.passwordLoginSupported)
|
||||||
Row(children: [
|
Row(children: [
|
||||||
Expanded(child: Divider()),
|
const Expanded(child: Divider()),
|
||||||
Padding(
|
Padding(
|
||||||
padding: const EdgeInsets.all(12.0),
|
padding: const EdgeInsets.all(12.0),
|
||||||
child: Text(L10n.of(context).or),
|
child: Text(L10n.of(context).or),
|
||||||
),
|
),
|
||||||
Expanded(child: Divider()),
|
const Expanded(child: Divider()),
|
||||||
]),
|
]),
|
||||||
},
|
},
|
||||||
Row(
|
Row(
|
||||||
@ -133,13 +133,13 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
child: _LoginButton(
|
child: _LoginButton(
|
||||||
onPressed: () =>
|
onPressed: () =>
|
||||||
VRouter.of(context).to('login'),
|
VRouter.of(context).to('login'),
|
||||||
icon: Icon(Icons.login_outlined),
|
icon: const Icon(Icons.login_outlined),
|
||||||
labelText: L10n.of(context).login,
|
labelText: L10n.of(context).login,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (controller.registrationSupported &&
|
if (controller.registrationSupported &&
|
||||||
controller.passwordLoginSupported)
|
controller.passwordLoginSupported)
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
if (controller.registrationSupported &&
|
if (controller.registrationSupported &&
|
||||||
// Registration is broken on matrix.org
|
// Registration is broken on matrix.org
|
||||||
Matrix.of(context)
|
Matrix.of(context)
|
||||||
@ -150,7 +150,8 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
Expanded(
|
Expanded(
|
||||||
child: _LoginButton(
|
child: _LoginButton(
|
||||||
onPressed: controller.signUpAction,
|
onPressed: controller.signUpAction,
|
||||||
icon: Icon(Icons.add_box_outlined),
|
icon:
|
||||||
|
const Icon(Icons.add_box_outlined),
|
||||||
labelText: L10n.of(context).register,
|
labelText: L10n.of(context).register,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -160,7 +161,8 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
.map(
|
.map(
|
||||||
(widget) => Container(
|
(widget) => Container(
|
||||||
height: 64,
|
height: 64,
|
||||||
padding: EdgeInsets.only(bottom: 12),
|
padding:
|
||||||
|
const EdgeInsets.only(bottom: 12),
|
||||||
child: widget),
|
child: widget),
|
||||||
)
|
)
|
||||||
.toList(),
|
.toList(),
|
||||||
@ -174,7 +176,7 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
onPressed: () => launch(AppConfig.privacyUrl),
|
onPressed: () => launch(AppConfig.privacyUrl),
|
||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).privacy,
|
L10n.of(context).privacy,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
color: Colors.blueGrey,
|
color: Colors.blueGrey,
|
||||||
),
|
),
|
||||||
@ -184,7 +186,7 @@ class HomeserverPickerView extends StatelessWidget {
|
|||||||
onPressed: () => PlatformInfos.showDialog(context),
|
onPressed: () => PlatformInfos.showDialog(context),
|
||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).about,
|
L10n.of(context).about,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
color: Colors.blueGrey,
|
color: Colors.blueGrey,
|
||||||
),
|
),
|
||||||
@ -213,7 +215,7 @@ class _LoginButton extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return OutlinedButton.icon(
|
return OutlinedButton.icon(
|
||||||
style: OutlinedButton.styleFrom(
|
style: OutlinedButton.styleFrom(
|
||||||
minimumSize: Size(256, 56),
|
minimumSize: const Size(256, 56),
|
||||||
side: BorderSide(
|
side: BorderSide(
|
||||||
color: Theme.of(context).textTheme.bodyText1.color,
|
color: Theme.of(context).textTheme.bodyText1.color,
|
||||||
),
|
),
|
||||||
|
@ -16,21 +16,21 @@ class ImageViewerView extends StatelessWidget {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: Navigator.of(context).pop,
|
onPressed: Navigator.of(context).pop,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
),
|
),
|
||||||
backgroundColor: Color(0x44000000),
|
backgroundColor: const Color(0x44000000),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.reply_outlined),
|
icon: const Icon(Icons.reply_outlined),
|
||||||
onPressed: controller.forwardAction,
|
onPressed: controller.forwardAction,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).share,
|
tooltip: L10n.of(context).share,
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.download_outlined),
|
icon: const Icon(Icons.download_outlined),
|
||||||
onPressed: controller.saveFileAction,
|
onPressed: controller.saveFileAction,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).downloadFile,
|
tooltip: L10n.of(context).downloadFile,
|
||||||
|
@ -24,7 +24,7 @@ class InvitationSelectionView extends StatelessWidget {
|
|||||||
leading: VRouter.of(context).path.startsWith('/spaces/')
|
leading: VRouter.of(context).path.startsWith('/spaces/')
|
||||||
? null
|
? null
|
||||||
: IconButton(
|
: IconButton(
|
||||||
icon: Icon(Icons.close_outlined),
|
icon: const Icon(Icons.close_outlined),
|
||||||
onPressed: () => VRouter.of(context)
|
onPressed: () => VRouter.of(context)
|
||||||
.toSegments(['rooms', controller.roomId]),
|
.toSegments(['rooms', controller.roomId]),
|
||||||
),
|
),
|
||||||
@ -39,7 +39,7 @@ class InvitationSelectionView extends StatelessWidget {
|
|||||||
withScrolling: true,
|
withScrolling: true,
|
||||||
child: controller.foundProfiles.isNotEmpty
|
child: controller.foundProfiles.isNotEmpty
|
||||||
? ListView.builder(
|
? ListView.builder(
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
itemCount: controller.foundProfiles.length,
|
itemCount: controller.foundProfiles.length,
|
||||||
itemBuilder: (BuildContext context, int i) => ListTile(
|
itemBuilder: (BuildContext context, int i) => ListTile(
|
||||||
@ -61,13 +61,13 @@ class InvitationSelectionView extends StatelessWidget {
|
|||||||
future: controller.getContacts(context),
|
future: controller.getContacts(context),
|
||||||
builder: (BuildContext context, snapshot) {
|
builder: (BuildContext context, snapshot) {
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(strokeWidth: 2),
|
child: CircularProgressIndicator.adaptive(strokeWidth: 2),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
final contacts = snapshot.data;
|
final contacts = snapshot.data;
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
itemCount: contacts.length,
|
itemCount: contacts.length,
|
||||||
itemBuilder: (BuildContext context, int i) => ListTile(
|
itemBuilder: (BuildContext context, int i) => ListTile(
|
||||||
|
@ -15,7 +15,7 @@ class LoginView extends StatelessWidget {
|
|||||||
return OnePageCard(
|
return OnePageCard(
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: controller.loading ? Container() : BackButton(),
|
leading: controller.loading ? Container() : const BackButton(),
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).logInTo(Matrix.of(context)
|
L10n.of(context).logInTo(Matrix.of(context)
|
||||||
@ -40,7 +40,7 @@ class LoginView extends StatelessWidget {
|
|||||||
autofillHints:
|
autofillHints:
|
||||||
controller.loading ? null : [AutofillHints.username],
|
controller.loading ? null : [AutofillHints.username],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
prefixIcon: Icon(Icons.account_box_outlined),
|
prefixIcon: const Icon(Icons.account_box_outlined),
|
||||||
hintText: L10n.of(context).username,
|
hintText: L10n.of(context).username,
|
||||||
errorText: controller.usernameError,
|
errorText: controller.usernameError,
|
||||||
labelText: L10n.of(context).username),
|
labelText: L10n.of(context).username),
|
||||||
@ -57,7 +57,7 @@ class LoginView extends StatelessWidget {
|
|||||||
obscureText: !controller.showPassword,
|
obscureText: !controller.showPassword,
|
||||||
onSubmitted: controller.login,
|
onSubmitted: controller.login,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
prefixIcon: Icon(Icons.lock_outlined),
|
prefixIcon: const Icon(Icons.lock_outlined),
|
||||||
hintText: '****',
|
hintText: '****',
|
||||||
errorText: controller.passwordError,
|
errorText: controller.passwordError,
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
@ -71,17 +71,17 @@ class LoginView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
Hero(
|
Hero(
|
||||||
tag: 'loginButton',
|
tag: 'loginButton',
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: controller.loading
|
onPressed: controller.loading
|
||||||
? null
|
? null
|
||||||
: () => controller.login(context),
|
: () => controller.login(context),
|
||||||
child: controller.loading
|
child: controller.loading
|
||||||
? LinearProgressIndicator()
|
? const LinearProgressIndicator()
|
||||||
: Text(L10n.of(context).login),
|
: Text(L10n.of(context).login),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -91,7 +91,7 @@ class LoginView extends StatelessWidget {
|
|||||||
onPressed: controller.passwordForgotten,
|
onPressed: controller.passwordForgotten,
|
||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).passwordForgotten,
|
L10n.of(context).passwordForgotten,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
color: Colors.blue,
|
color: Colors.blue,
|
||||||
decoration: TextDecoration.underline,
|
decoration: TextDecoration.underline,
|
||||||
),
|
),
|
||||||
|
@ -12,7 +12,7 @@ class NewGroupView extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).createNewGroup),
|
title: Text(L10n.of(context).createNewGroup),
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
),
|
),
|
||||||
@ -30,7 +30,7 @@ class NewGroupView extends StatelessWidget {
|
|||||||
onSubmitted: controller.submitAction,
|
onSubmitted: controller.submitAction,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: L10n.of(context).optionalGroupName,
|
labelText: L10n.of(context).optionalGroupName,
|
||||||
prefixIcon: Icon(Icons.people_outlined),
|
prefixIcon: const Icon(Icons.people_outlined),
|
||||||
hintText: L10n.of(context).enterAGroupName),
|
hintText: L10n.of(context).enterAGroupName),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -47,7 +47,7 @@ class NewGroupView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
floatingActionButton: FloatingActionButton(
|
floatingActionButton: FloatingActionButton(
|
||||||
onPressed: controller.submitAction,
|
onPressed: controller.submitAction,
|
||||||
child: Icon(Icons.arrow_forward_outlined),
|
child: const Icon(Icons.arrow_forward_outlined),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ class NewPrivateChatView extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).newChat),
|
title: Text(L10n.of(context).newChat),
|
||||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
@ -39,9 +39,9 @@ class NewPrivateChatView extends StatelessWidget {
|
|||||||
child: ListView(
|
child: ListView(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
margin: EdgeInsets.all(_qrCodePadding),
|
margin: const EdgeInsets.all(_qrCodePadding),
|
||||||
alignment: Alignment.center,
|
alignment: Alignment.center,
|
||||||
padding: EdgeInsets.all(_qrCodePadding * 2),
|
padding: const EdgeInsets.all(_qrCodePadding * 2),
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: controller.inviteAction,
|
onTap: controller.inviteAction,
|
||||||
borderRadius: BorderRadius.circular(12),
|
borderRadius: BorderRadius.circular(12),
|
||||||
@ -54,25 +54,25 @@ class NewPrivateChatView extends StatelessWidget {
|
|||||||
'https://matrix.to/#/${Matrix.of(context).client.userID}',
|
'https://matrix.to/#/${Matrix.of(context).client.userID}',
|
||||||
version: QrVersions.auto,
|
version: QrVersions.auto,
|
||||||
size: min(MediaQuery.of(context).size.width - 16, 200),
|
size: min(MediaQuery.of(context).size.width - 16, 200),
|
||||||
embeddedImage: AssetImage('assets/share.png'),
|
embeddedImage: const AssetImage('assets/share.png'),
|
||||||
embeddedImageStyle: QrEmbeddedImageStyle(
|
embeddedImageStyle: QrEmbeddedImageStyle(
|
||||||
size: Size(48, 48),
|
size: const Size(48, 48),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(),
|
const Divider(),
|
||||||
ListTile(
|
ListTile(
|
||||||
subtitle: Text(L10n.of(context).createNewChatExplaination),
|
subtitle: Text(L10n.of(context).createNewChatExplaination),
|
||||||
trailing: Padding(
|
trailing: const Padding(
|
||||||
padding: const EdgeInsets.all(8.0),
|
padding: EdgeInsets.all(8.0),
|
||||||
child: Icon(Icons.info_outline_rounded),
|
child: Icon(Icons.info_outline_rounded),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(),
|
const Divider(),
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
child: Form(
|
child: Form(
|
||||||
key: controller.formKey,
|
key: controller.formKey,
|
||||||
child: TextFormField(
|
child: TextFormField(
|
||||||
@ -86,7 +86,7 @@ class NewPrivateChatView extends StatelessWidget {
|
|||||||
hintText: '@username',
|
hintText: '@username',
|
||||||
prefixText: 'https://matrix.to/#/',
|
prefixText: 'https://matrix.to/#/',
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
icon: Icon(Icons.send_outlined),
|
icon: const Icon(Icons.send_outlined),
|
||||||
onPressed: controller.submitAction,
|
onPressed: controller.submitAction,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -107,7 +107,7 @@ class NewPrivateChatView extends StatelessWidget {
|
|||||||
? FloatingActionButton.extended(
|
? FloatingActionButton.extended(
|
||||||
onPressed: controller.openScannerAction,
|
onPressed: controller.openScannerAction,
|
||||||
label: Text(L10n.of(context).scanQrCode),
|
label: Text(L10n.of(context).scanQrCode),
|
||||||
icon: Icon(Icons.camera_alt_outlined),
|
icon: const Icon(Icons.camera_alt_outlined),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
);
|
);
|
||||||
|
@ -13,7 +13,7 @@ class NewSpaceView extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).createNewSpace),
|
title: Text(L10n.of(context).createNewSpace),
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
),
|
),
|
||||||
@ -31,7 +31,7 @@ class NewSpaceView extends StatelessWidget {
|
|||||||
onSubmitted: controller.submitAction,
|
onSubmitted: controller.submitAction,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
labelText: L10n.of(context).spaceName,
|
labelText: L10n.of(context).spaceName,
|
||||||
prefixIcon: Icon(Icons.people_outlined),
|
prefixIcon: const Icon(Icons.people_outlined),
|
||||||
hintText: L10n.of(context).enterASpacepName),
|
hintText: L10n.of(context).enterASpacepName),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -48,7 +48,7 @@ class NewSpaceView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
floatingActionButton: FloatingActionButton(
|
floatingActionButton: FloatingActionButton(
|
||||||
onPressed: controller.submitAction,
|
onPressed: controller.submitAction,
|
||||||
child: Icon(Icons.arrow_forward_outlined),
|
child: const Icon(Icons.arrow_forward_outlined),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -69,21 +69,21 @@ class SearchView extends StatelessWidget {
|
|||||||
controller.controller.text?.startsWith('#') ?? false ? 0 : 1,
|
controller.controller.text?.startsWith('#') ?? false ? 0 : 1,
|
||||||
child: Scaffold(
|
child: Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
titleSpacing: 0,
|
titleSpacing: 0,
|
||||||
title: DefaultAppBarSearchField(
|
title: DefaultAppBarSearchField(
|
||||||
autofocus: true,
|
autofocus: true,
|
||||||
hintText: L10n.of(context).search,
|
hintText: L10n.of(context).search,
|
||||||
searchController: controller.controller,
|
searchController: controller.controller,
|
||||||
suffix: Icon(Icons.search_outlined),
|
suffix: const Icon(Icons.search_outlined),
|
||||||
onChanged: controller.search,
|
onChanged: controller.search,
|
||||||
),
|
),
|
||||||
bottom: TabBar(
|
bottom: TabBar(
|
||||||
indicatorColor: Theme.of(context).colorScheme.secondary,
|
indicatorColor: Theme.of(context).colorScheme.secondary,
|
||||||
labelColor: Theme.of(context).colorScheme.secondary,
|
labelColor: Theme.of(context).colorScheme.secondary,
|
||||||
unselectedLabelColor: Theme.of(context).textTheme.bodyText1.color,
|
unselectedLabelColor: Theme.of(context).textTheme.bodyText1.color,
|
||||||
labelStyle: TextStyle(fontSize: 16),
|
labelStyle: const TextStyle(fontSize: 16),
|
||||||
labelPadding: EdgeInsets.symmetric(
|
labelPadding: const EdgeInsets.symmetric(
|
||||||
horizontal: 8,
|
horizontal: 8,
|
||||||
vertical: 0,
|
vertical: 0,
|
||||||
),
|
),
|
||||||
@ -101,12 +101,12 @@ class SearchView extends StatelessWidget {
|
|||||||
? ScrollViewKeyboardDismissBehavior.onDrag
|
? ScrollViewKeyboardDismissBehavior.onDrag
|
||||||
: ScrollViewKeyboardDismissBehavior.manual,
|
: ScrollViewKeyboardDismissBehavior.manual,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: CircleAvatar(
|
leading: CircleAvatar(
|
||||||
foregroundColor: Theme.of(context).colorScheme.secondary,
|
foregroundColor: Theme.of(context).colorScheme.secondary,
|
||||||
backgroundColor: Theme.of(context).secondaryHeaderColor,
|
backgroundColor: Theme.of(context).secondaryHeaderColor,
|
||||||
child: Icon(Icons.edit_outlined),
|
child: const Icon(Icons.edit_outlined),
|
||||||
),
|
),
|
||||||
title: Text(L10n.of(context).changeTheServer),
|
title: Text(L10n.of(context).changeTheServer),
|
||||||
onTap: controller.setServer,
|
onTap: controller.setServer,
|
||||||
@ -119,8 +119,8 @@ class SearchView extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 32),
|
const SizedBox(height: 32),
|
||||||
Icon(
|
const Icon(
|
||||||
Icons.error_outlined,
|
Icons.error_outlined,
|
||||||
size: 80,
|
size: 80,
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
@ -129,7 +129,7 @@ class SearchView extends StatelessWidget {
|
|||||||
child: Text(
|
child: Text(
|
||||||
snapshot.error.toLocalizedString(context),
|
snapshot.error.toLocalizedString(context),
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
),
|
),
|
||||||
@ -139,7 +139,7 @@ class SearchView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (snapshot.connectionState != ConnectionState.done) {
|
if (snapshot.connectionState != ConnectionState.done) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(
|
child: CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2));
|
strokeWidth: 2));
|
||||||
}
|
}
|
||||||
@ -148,8 +148,8 @@ class SearchView extends StatelessWidget {
|
|||||||
return Column(
|
return Column(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
SizedBox(height: 32),
|
const SizedBox(height: 32),
|
||||||
Icon(
|
const Icon(
|
||||||
Icons.search_outlined,
|
Icons.search_outlined,
|
||||||
size: 80,
|
size: 80,
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
@ -158,7 +158,7 @@ class SearchView extends StatelessWidget {
|
|||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).noPublicRoomsFound,
|
L10n.of(context).noPublicRoomsFound,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
color: Colors.grey,
|
color: Colors.grey,
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
),
|
),
|
||||||
@ -169,9 +169,9 @@ class SearchView extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
return GridView.builder(
|
return GridView.builder(
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
padding: EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||||
crossAxisCount: 2,
|
crossAxisCount: 2,
|
||||||
childAspectRatio: 1,
|
childAspectRatio: 1,
|
||||||
crossAxisSpacing: 16,
|
crossAxisSpacing: 16,
|
||||||
@ -195,7 +195,7 @@ class SearchView extends StatelessWidget {
|
|||||||
publicRoomsResponse.chunk[i].name),
|
publicRoomsResponse.chunk[i].name),
|
||||||
Text(
|
Text(
|
||||||
publicRoomsResponse.chunk[i].name,
|
publicRoomsResponse.chunk[i].name,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
@ -207,7 +207,7 @@ class SearchView extends StatelessWidget {
|
|||||||
publicRoomsResponse
|
publicRoomsResponse
|
||||||
.chunk[i].numJoinedMembers ??
|
.chunk[i].numJoinedMembers ??
|
||||||
0),
|
0),
|
||||||
style: TextStyle(fontSize: 10.5),
|
style: const TextStyle(fontSize: 10.5),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
textAlign: TextAlign.center,
|
textAlign: TextAlign.center,
|
||||||
),
|
),
|
||||||
@ -262,13 +262,13 @@ class SearchView extends StatelessWidget {
|
|||||||
title: Text(
|
title: Text(
|
||||||
foundProfile.displayName ??
|
foundProfile.displayName ??
|
||||||
foundProfile.userId.localpart,
|
foundProfile.userId.localpart,
|
||||||
style: TextStyle(),
|
style: const TextStyle(),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
),
|
),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
foundProfile.userId,
|
foundProfile.userId,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -15,11 +15,11 @@ class Settings3PidView extends StatelessWidget {
|
|||||||
controller.request ??= Matrix.of(context).client.getAccount3PIDs();
|
controller.request ??= Matrix.of(context).client.getAccount3PIDs();
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).passwordRecovery),
|
title: Text(L10n.of(context).passwordRecovery),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.add_outlined),
|
icon: const Icon(Icons.add_outlined),
|
||||||
onPressed: controller.add3PidAction,
|
onPressed: controller.add3PidAction,
|
||||||
tooltip: L10n.of(context).addEmail,
|
tooltip: L10n.of(context).addEmail,
|
||||||
)
|
)
|
||||||
@ -39,7 +39,7 @@ class Settings3PidView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (!snapshot.hasData) {
|
if (!snapshot.hasData) {
|
||||||
return Center(
|
return const Center(
|
||||||
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
child: CircularProgressIndicator.adaptive(strokeWidth: 2));
|
||||||
}
|
}
|
||||||
final identifier = snapshot.data;
|
final identifier = snapshot.data;
|
||||||
@ -63,7 +63,7 @@ class Settings3PidView extends StatelessWidget {
|
|||||||
.withTheseAddressesRecoveryDescription,
|
.withTheseAddressesRecoveryDescription,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: ListView.builder(
|
child: ListView.builder(
|
||||||
itemCount: identifier.length,
|
itemCount: identifier.length,
|
||||||
@ -76,7 +76,7 @@ class Settings3PidView extends StatelessWidget {
|
|||||||
title: Text(identifier[i].address),
|
title: Text(identifier[i].address),
|
||||||
trailing: IconButton(
|
trailing: IconButton(
|
||||||
tooltip: L10n.of(context).delete,
|
tooltip: L10n.of(context).delete,
|
||||||
icon: Icon(Icons.delete_forever_outlined),
|
icon: const Icon(Icons.delete_forever_outlined),
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
onPressed: () => controller.delete3Pid(identifier[i]),
|
onPressed: () => controller.delete3Pid(identifier[i]),
|
||||||
),
|
),
|
||||||
|
@ -22,51 +22,51 @@ class SettingsAccountView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.add_box_outlined),
|
trailing: const Icon(Icons.add_box_outlined),
|
||||||
title: Text(L10n.of(context).addAccount),
|
title: Text(L10n.of(context).addAccount),
|
||||||
subtitle: Text(L10n.of(context).enableMultiAccounts),
|
subtitle: Text(L10n.of(context).enableMultiAccounts),
|
||||||
onTap: controller.addAccountAction,
|
onTap: controller.addAccountAction,
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).yourUserId),
|
title: Text(L10n.of(context).yourUserId),
|
||||||
subtitle: Text(Matrix.of(context).client.userID),
|
subtitle: Text(Matrix.of(context).client.userID),
|
||||||
trailing: Icon(Icons.copy_outlined),
|
trailing: const Icon(Icons.copy_outlined),
|
||||||
onTap: () => FluffyShare.share(
|
onTap: () => FluffyShare.share(
|
||||||
Matrix.of(context).client.userID,
|
Matrix.of(context).client.userID,
|
||||||
context,
|
context,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.edit_outlined),
|
trailing: const Icon(Icons.edit_outlined),
|
||||||
title: Text(L10n.of(context).editDisplayname),
|
title: Text(L10n.of(context).editDisplayname),
|
||||||
subtitle: Text(controller.profile?.displayName ??
|
subtitle: Text(controller.profile?.displayName ??
|
||||||
Matrix.of(context).client.userID.localpart),
|
Matrix.of(context).client.userID.localpart),
|
||||||
onTap: controller.setDisplaynameAction,
|
onTap: controller.setDisplaynameAction,
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.phone_outlined),
|
trailing: const Icon(Icons.phone_outlined),
|
||||||
title: Text(L10n.of(context).editJitsiInstance),
|
title: Text(L10n.of(context).editJitsiInstance),
|
||||||
subtitle: Text(AppConfig.jitsiInstance),
|
subtitle: Text(AppConfig.jitsiInstance),
|
||||||
onTap: controller.setJitsiInstanceAction,
|
onTap: controller.setJitsiInstanceAction,
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.devices_other_outlined),
|
trailing: const Icon(Icons.devices_other_outlined),
|
||||||
title: Text(L10n.of(context).devices),
|
title: Text(L10n.of(context).devices),
|
||||||
onTap: () => VRouter.of(context).to('devices'),
|
onTap: () => VRouter.of(context).to('devices'),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.exit_to_app_outlined),
|
trailing: const Icon(Icons.exit_to_app_outlined),
|
||||||
title: Text(L10n.of(context).logout),
|
title: Text(L10n.of(context).logout),
|
||||||
onTap: controller.logoutAction,
|
onTap: controller.logoutAction,
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.delete_forever_outlined),
|
trailing: const Icon(Icons.delete_forever_outlined),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).deleteAccount,
|
L10n.of(context).deleteAccount,
|
||||||
style: TextStyle(color: Colors.red),
|
style: const TextStyle(color: Colors.red),
|
||||||
),
|
),
|
||||||
onTap: controller.deleteAccountAction,
|
onTap: controller.deleteAccountAction,
|
||||||
),
|
),
|
||||||
|
@ -24,14 +24,14 @@ class SettingsChatView extends StatelessWidget {
|
|||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).changeTheme),
|
title: Text(L10n.of(context).changeTheme),
|
||||||
onTap: () => VRouter.of(context).to('style'),
|
onTap: () => VRouter.of(context).to('style'),
|
||||||
trailing: Icon(Icons.style_outlined),
|
trailing: const Icon(Icons.style_outlined),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).emoteSettings),
|
title: Text(L10n.of(context).emoteSettings),
|
||||||
onTap: () => VRouter.of(context).to('emotes'),
|
onTap: () => VRouter.of(context).to('emotes'),
|
||||||
trailing: Icon(Icons.insert_emoticon_outlined),
|
trailing: const Icon(Icons.insert_emoticon_outlined),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
SettingsSwitchListTile(
|
SettingsSwitchListTile(
|
||||||
title: L10n.of(context).renderRichContent,
|
title: L10n.of(context).renderRichContent,
|
||||||
onChanged: (b) => AppConfig.renderHtml = b,
|
onChanged: (b) => AppConfig.renderHtml = b,
|
||||||
|
@ -20,13 +20,13 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
final imageKeys = controller.pack.images.keys.toList();
|
final imageKeys = controller.pack.images.keys.toList();
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).emoteSettings),
|
title: Text(L10n.of(context).emoteSettings),
|
||||||
),
|
),
|
||||||
floatingActionButton: controller.showSave
|
floatingActionButton: controller.showSave
|
||||||
? FloatingActionButton(
|
? FloatingActionButton(
|
||||||
onPressed: controller.saveAction,
|
onPressed: controller.saveAction,
|
||||||
child: Icon(Icons.save_outlined, color: Colors.white),
|
child: const Icon(Icons.save_outlined, color: Colors.white),
|
||||||
)
|
)
|
||||||
: null,
|
: null,
|
||||||
body: MaxWidthBody(
|
body: MaxWidthBody(
|
||||||
@ -34,16 +34,16 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (!controller.readonly)
|
if (!controller.readonly)
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
vertical: 8.0,
|
vertical: 8.0,
|
||||||
),
|
),
|
||||||
child: ListTile(
|
child: ListTile(
|
||||||
leading: Container(
|
leading: Container(
|
||||||
width: 180.0,
|
width: 180.0,
|
||||||
height: 38,
|
height: 38,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(10)),
|
borderRadius: const BorderRadius.all(Radius.circular(10)),
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
),
|
),
|
||||||
child: TextField(
|
child: TextField(
|
||||||
@ -73,7 +73,7 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
trailing: InkWell(
|
trailing: InkWell(
|
||||||
onTap: controller.addImageAction,
|
onTap: controller.addImageAction,
|
||||||
child: Icon(
|
child: const Icon(
|
||||||
Icons.add_outlined,
|
Icons.add_outlined,
|
||||||
color: Colors.green,
|
color: Colors.green,
|
||||||
size: 32.0,
|
size: 32.0,
|
||||||
@ -99,10 +99,10 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
child: imageKeys.isEmpty
|
child: imageKeys.isEmpty
|
||||||
? Center(
|
? Center(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.all(16),
|
padding: const EdgeInsets.all(16),
|
||||||
child: Text(
|
child: Text(
|
||||||
L10n.of(context).noEmotesFound,
|
L10n.of(context).noEmotesFound,
|
||||||
style: TextStyle(fontSize: 20),
|
style: const TextStyle(fontSize: 20),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@ -124,10 +124,10 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
leading: Container(
|
leading: Container(
|
||||||
width: 180.0,
|
width: 180.0,
|
||||||
height: 38,
|
height: 38,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 8),
|
padding: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
borderRadius:
|
borderRadius:
|
||||||
BorderRadius.all(Radius.circular(10)),
|
const BorderRadius.all(Radius.circular(10)),
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
),
|
),
|
||||||
child: Shortcuts(
|
child: Shortcuts(
|
||||||
@ -193,7 +193,7 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
: InkWell(
|
: InkWell(
|
||||||
onTap: () =>
|
onTap: () =>
|
||||||
controller.removeImageAction(imageCode),
|
controller.removeImageAction(imageCode),
|
||||||
child: Icon(
|
child: const Icon(
|
||||||
Icons.delete_forever_outlined,
|
Icons.delete_forever_outlined,
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
size: 32.0,
|
size: 32.0,
|
||||||
@ -212,11 +212,11 @@ class EmotesSettingsView extends StatelessWidget {
|
|||||||
|
|
||||||
class _EmoteImage extends StatelessWidget {
|
class _EmoteImage extends StatelessWidget {
|
||||||
final Uri mxc;
|
final Uri mxc;
|
||||||
_EmoteImage(this.mxc);
|
const _EmoteImage(this.mxc);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final size = 38.0;
|
const size = 38.0;
|
||||||
final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
|
final devicePixelRatio = MediaQuery.of(context).devicePixelRatio;
|
||||||
final url = mxc?.getThumbnail(
|
final url = mxc?.getThumbnail(
|
||||||
Matrix.of(context).client,
|
Matrix.of(context).client,
|
||||||
@ -238,7 +238,7 @@ class _ImagePicker extends StatefulWidget {
|
|||||||
|
|
||||||
final void Function(ValueNotifier<ImagePackImageContent>) onPressed;
|
final void Function(ValueNotifier<ImagePackImageContent>) onPressed;
|
||||||
|
|
||||||
_ImagePicker({@required this.controller, @required this.onPressed});
|
const _ImagePicker({@required this.controller, @required this.onPressed});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_ImagePickerState createState() => _ImagePickerState();
|
_ImagePickerState createState() => _ImagePickerState();
|
||||||
|
@ -18,7 +18,7 @@ class SettingsIgnoreListView extends StatelessWidget {
|
|||||||
final client = Matrix.of(context).client;
|
final client = Matrix.of(context).client;
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).ignoredUsers),
|
title: Text(L10n.of(context).ignoredUsers),
|
||||||
),
|
),
|
||||||
body: MaxWidthBody(
|
body: MaxWidthBody(
|
||||||
@ -35,26 +35,26 @@ class SettingsIgnoreListView extends StatelessWidget {
|
|||||||
textInputAction: TextInputAction.done,
|
textInputAction: TextInputAction.done,
|
||||||
onSubmitted: (_) => controller.ignoreUser(context),
|
onSubmitted: (_) => controller.ignoreUser(context),
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
border: OutlineInputBorder(),
|
border: const OutlineInputBorder(),
|
||||||
hintText: 'bad_guy:domain.abc',
|
hintText: 'bad_guy:domain.abc',
|
||||||
prefixText: '@',
|
prefixText: '@',
|
||||||
labelText: L10n.of(context).ignoreUsername,
|
labelText: L10n.of(context).ignoreUsername,
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
tooltip: L10n.of(context).ignore,
|
tooltip: L10n.of(context).ignore,
|
||||||
icon: Icon(Icons.done_outlined),
|
icon: const Icon(Icons.done_outlined),
|
||||||
onPressed: () => controller.ignoreUser(context),
|
onPressed: () => controller.ignoreUser(context),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Text(
|
Text(
|
||||||
L10n.of(context).ignoreListDescription,
|
L10n.of(context).ignoreListDescription,
|
||||||
style: TextStyle(color: Colors.orange),
|
style: const TextStyle(color: Colors.orange),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: StreamBuilder<Object>(
|
child: StreamBuilder<Object>(
|
||||||
stream: client.onAccountData.stream
|
stream: client.onAccountData.stream
|
||||||
@ -74,7 +74,7 @@ class SettingsIgnoreListView extends StatelessWidget {
|
|||||||
s.data?.displayName ?? client.ignoredUsers[i]),
|
s.data?.displayName ?? client.ignoredUsers[i]),
|
||||||
trailing: IconButton(
|
trailing: IconButton(
|
||||||
tooltip: L10n.of(context).delete,
|
tooltip: L10n.of(context).delete,
|
||||||
icon: Icon(Icons.delete_forever_outlined),
|
icon: const Icon(Icons.delete_forever_outlined),
|
||||||
onPressed: () => showFutureLoadingDialog(
|
onPressed: () => showFutureLoadingDialog(
|
||||||
context: context,
|
context: context,
|
||||||
future: () =>
|
future: () =>
|
||||||
|
@ -8,14 +8,14 @@ import 'package:vrouter/vrouter.dart';
|
|||||||
class MultipleEmotesSettingsView extends StatelessWidget {
|
class MultipleEmotesSettingsView extends StatelessWidget {
|
||||||
final MultipleEmotesSettingsController controller;
|
final MultipleEmotesSettingsController controller;
|
||||||
|
|
||||||
MultipleEmotesSettingsView(this.controller, {Key key}) : super(key: key);
|
const MultipleEmotesSettingsView(this.controller, {Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final room = Matrix.of(context).client.getRoomById(controller.roomId);
|
final room = Matrix.of(context).client.getRoomById(controller.roomId);
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).emotePacks),
|
title: Text(L10n.of(context).emotePacks),
|
||||||
),
|
),
|
||||||
body: StreamBuilder(
|
body: StreamBuilder(
|
||||||
|
@ -20,7 +20,7 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).notifications),
|
title: Text(L10n.of(context).notifications),
|
||||||
),
|
),
|
||||||
body: MaxWidthBody(
|
body: MaxWidthBody(
|
||||||
@ -56,11 +56,11 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor,
|
Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.edit_outlined),
|
child: const Icon(Icons.edit_outlined),
|
||||||
),
|
),
|
||||||
onTap: controller.openAndroidNotificationSettingsAction,
|
onTap: controller.openAndroidNotificationSettingsAction,
|
||||||
),
|
),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).pushRules,
|
L10n.of(context).pushRules,
|
||||||
@ -78,7 +78,7 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
controller.setNotificationSetting(item, enabled),
|
controller.setNotificationSetting(item, enabled),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).devices,
|
L10n.of(context).devices,
|
||||||
@ -99,13 +99,13 @@ class SettingsNotificationsView extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (snapshot.connectionState != ConnectionState.done) {
|
if (snapshot.connectionState != ConnectionState.done) {
|
||||||
Center(
|
const Center(
|
||||||
child: CircularProgressIndicator.adaptive(
|
child: CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2));
|
strokeWidth: 2));
|
||||||
}
|
}
|
||||||
final pushers = snapshot.data ?? [];
|
final pushers = snapshot.data ?? [];
|
||||||
return ListView.builder(
|
return ListView.builder(
|
||||||
physics: NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
shrinkWrap: true,
|
shrinkWrap: true,
|
||||||
itemCount: pushers.length,
|
itemCount: pushers.length,
|
||||||
itemBuilder: (_, i) => ListTile(
|
itemBuilder: (_, i) => ListTile(
|
||||||
|
@ -22,27 +22,27 @@ class SettingsSecurityView extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.block_outlined),
|
trailing: const Icon(Icons.block_outlined),
|
||||||
title: Text(L10n.of(context).ignoredUsers),
|
title: Text(L10n.of(context).ignoredUsers),
|
||||||
onTap: () => VRouter.of(context).to('ignorelist'),
|
onTap: () => VRouter.of(context).to('ignorelist'),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.security_outlined),
|
trailing: const Icon(Icons.security_outlined),
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).changePassword,
|
L10n.of(context).changePassword,
|
||||||
),
|
),
|
||||||
onTap: controller.changePasswordAccountAction,
|
onTap: controller.changePasswordAccountAction,
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.email_outlined),
|
trailing: const Icon(Icons.email_outlined),
|
||||||
title: Text(L10n.of(context).passwordRecovery),
|
title: Text(L10n.of(context).passwordRecovery),
|
||||||
onTap: () => VRouter.of(context).to('3pid'),
|
onTap: () => VRouter.of(context).to('3pid'),
|
||||||
),
|
),
|
||||||
if (Matrix.of(context).client.encryption != null) ...{
|
if (Matrix.of(context).client.encryption != null) ...{
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
if (PlatformInfos.isMobile)
|
if (PlatformInfos.isMobile)
|
||||||
ListTile(
|
ListTile(
|
||||||
trailing: Icon(Icons.lock_outlined),
|
trailing: const Icon(Icons.lock_outlined),
|
||||||
title: Text(L10n.of(context).appLock),
|
title: Text(L10n.of(context).appLock),
|
||||||
onTap: controller.setAppLockAction,
|
onTap: controller.setAppLockAction,
|
||||||
),
|
),
|
||||||
@ -55,11 +55,11 @@ class SettingsSecurityView extends StatelessWidget {
|
|||||||
message: Matrix.of(context).client.fingerprintKey.beautified,
|
message: Matrix.of(context).client.fingerprintKey.beautified,
|
||||||
okLabel: L10n.of(context).ok,
|
okLabel: L10n.of(context).ok,
|
||||||
),
|
),
|
||||||
trailing: Icon(Icons.vpn_key_outlined),
|
trailing: const Icon(Icons.vpn_key_outlined),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).cachedKeys),
|
title: Text(L10n.of(context).cachedKeys),
|
||||||
trailing: Icon(Icons.wb_cloudy_outlined),
|
trailing: const Icon(Icons.wb_cloudy_outlined),
|
||||||
subtitle: Text(
|
subtitle: Text(
|
||||||
'${Matrix.of(context).client.encryption.keyManager.enabled ? L10n.of(context).onlineKeyBackupEnabled : L10n.of(context).onlineKeyBackupDisabled}\n${Matrix.of(context).client.encryption.crossSigning.enabled ? L10n.of(context).crossSigningEnabled : L10n.of(context).crossSigningDisabled}'),
|
'${Matrix.of(context).client.encryption.keyManager.enabled ? L10n.of(context).onlineKeyBackupEnabled : L10n.of(context).onlineKeyBackupDisabled}\n${Matrix.of(context).client.encryption.crossSigning.enabled ? L10n.of(context).crossSigningEnabled : L10n.of(context).crossSigningDisabled}'),
|
||||||
onTap: controller.bootstrapSettingsAction,
|
onTap: controller.bootstrapSettingsAction,
|
||||||
|
@ -17,7 +17,7 @@ class SettingsStyleView extends StatelessWidget {
|
|||||||
controller.currentTheme ??= AdaptiveTheme.of(context).mode;
|
controller.currentTheme ??= AdaptiveTheme.of(context).mode;
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
title: Text(L10n.of(context).changeTheme),
|
title: Text(L10n.of(context).changeTheme),
|
||||||
),
|
),
|
||||||
body: MaxWidthBody(
|
body: MaxWidthBody(
|
||||||
@ -42,7 +42,7 @@ class SettingsStyleView extends StatelessWidget {
|
|||||||
title: Text(L10n.of(context).darkTheme),
|
title: Text(L10n.of(context).darkTheme),
|
||||||
onChanged: controller.switchTheme,
|
onChanged: controller.switchTheme,
|
||||||
),
|
),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).wallpaper,
|
L10n.of(context).wallpaper,
|
||||||
@ -59,7 +59,7 @@ class SettingsStyleView extends StatelessWidget {
|
|||||||
height: 38,
|
height: 38,
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
),
|
),
|
||||||
trailing: Icon(
|
trailing: const Icon(
|
||||||
Icons.delete_forever_outlined,
|
Icons.delete_forever_outlined,
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
),
|
),
|
||||||
@ -68,11 +68,11 @@ class SettingsStyleView extends StatelessWidget {
|
|||||||
Builder(builder: (context) {
|
Builder(builder: (context) {
|
||||||
return ListTile(
|
return ListTile(
|
||||||
title: Text(L10n.of(context).changeWallpaper),
|
title: Text(L10n.of(context).changeWallpaper),
|
||||||
trailing: Icon(Icons.wallpaper_outlined),
|
trailing: const Icon(Icons.wallpaper_outlined),
|
||||||
onTap: controller.setWallpaperAction,
|
onTap: controller.setWallpaperAction,
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
Divider(height: 1),
|
const Divider(height: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(
|
title: Text(
|
||||||
L10n.of(context).fontSize,
|
L10n.of(context).fontSize,
|
||||||
|
@ -38,38 +38,38 @@ class SettingsView extends StatelessWidget {
|
|||||||
body: ListView(
|
body: ListView(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.notifications_outlined),
|
leading: const Icon(Icons.notifications_outlined),
|
||||||
title: Text(L10n.of(context).notifications),
|
title: Text(L10n.of(context).notifications),
|
||||||
onTap: () => VRouter.of(context).to('/settings/notifications'),
|
onTap: () => VRouter.of(context).to('/settings/notifications'),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.chat_bubble_outline),
|
leading: const Icon(Icons.chat_bubble_outline),
|
||||||
title: Text(L10n.of(context).chat),
|
title: Text(L10n.of(context).chat),
|
||||||
onTap: () => VRouter.of(context).to('/settings/chat'),
|
onTap: () => VRouter.of(context).to('/settings/chat'),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.account_box_outlined),
|
leading: const Icon(Icons.account_box_outlined),
|
||||||
title: Text(L10n.of(context).account),
|
title: Text(L10n.of(context).account),
|
||||||
onTap: () => VRouter.of(context).to('/settings/account'),
|
onTap: () => VRouter.of(context).to('/settings/account'),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.security_outlined),
|
leading: const Icon(Icons.security_outlined),
|
||||||
title: Text(L10n.of(context).security),
|
title: Text(L10n.of(context).security),
|
||||||
onTap: () => VRouter.of(context).to('/settings/security'),
|
onTap: () => VRouter.of(context).to('/settings/security'),
|
||||||
),
|
),
|
||||||
Divider(thickness: 1),
|
const Divider(thickness: 1),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.help_outlined),
|
leading: const Icon(Icons.help_outlined),
|
||||||
title: Text(L10n.of(context).help),
|
title: Text(L10n.of(context).help),
|
||||||
onTap: () => launch(AppConfig.supportUrl),
|
onTap: () => launch(AppConfig.supportUrl),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.privacy_tip_outlined),
|
leading: const Icon(Icons.privacy_tip_outlined),
|
||||||
title: Text(L10n.of(context).privacy),
|
title: Text(L10n.of(context).privacy),
|
||||||
onTap: () => launch(AppConfig.privacyUrl),
|
onTap: () => launch(AppConfig.privacyUrl),
|
||||||
),
|
),
|
||||||
ListTile(
|
ListTile(
|
||||||
leading: Icon(Icons.link_outlined),
|
leading: const Icon(Icons.link_outlined),
|
||||||
title: Text(L10n.of(context).about),
|
title: Text(L10n.of(context).about),
|
||||||
onTap: () => PlatformInfos.showDialog(context),
|
onTap: () => PlatformInfos.showDialog(context),
|
||||||
),
|
),
|
||||||
|
@ -32,7 +32,7 @@ class SignupPageView extends StatelessWidget {
|
|||||||
autofillHints:
|
autofillHints:
|
||||||
controller.loading ? null : [AutofillHints.username],
|
controller.loading ? null : [AutofillHints.username],
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
prefixIcon: Icon(Icons.account_box_outlined),
|
prefixIcon: const Icon(Icons.account_box_outlined),
|
||||||
hintText: L10n.of(context).username,
|
hintText: L10n.of(context).username,
|
||||||
errorText: controller.usernameError,
|
errorText: controller.usernameError,
|
||||||
labelText: L10n.of(context).username,
|
labelText: L10n.of(context).username,
|
||||||
@ -41,7 +41,7 @@ class SignupPageView extends StatelessWidget {
|
|||||||
':${Matrix.of(context).getLoginClient().homeserver.host}'),
|
':${Matrix.of(context).getLoginClient().homeserver.host}'),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(),
|
const Divider(),
|
||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).chooseAStrongPassword),
|
title: Text(L10n.of(context).chooseAStrongPassword),
|
||||||
subtitle: Text(L10n.of(context).newPasswordDescription),
|
subtitle: Text(L10n.of(context).newPasswordDescription),
|
||||||
@ -57,7 +57,7 @@ class SignupPageView extends StatelessWidget {
|
|||||||
obscureText: !controller.showPassword,
|
obscureText: !controller.showPassword,
|
||||||
onSubmitted: controller.signup,
|
onSubmitted: controller.signup,
|
||||||
decoration: InputDecoration(
|
decoration: InputDecoration(
|
||||||
prefixIcon: Icon(Icons.lock_outlined),
|
prefixIcon: const Icon(Icons.lock_outlined),
|
||||||
hintText: '****',
|
hintText: '****',
|
||||||
errorText: controller.passwordError,
|
errorText: controller.passwordError,
|
||||||
suffixIcon: IconButton(
|
suffixIcon: IconButton(
|
||||||
@ -71,16 +71,16 @@ class SignupPageView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
Divider(),
|
const Divider(),
|
||||||
SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
Hero(
|
Hero(
|
||||||
tag: 'loginButton',
|
tag: 'loginButton',
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||||
child: ElevatedButton(
|
child: ElevatedButton(
|
||||||
onPressed: controller.loading ? null : controller.signup,
|
onPressed: controller.loading ? null : controller.signup,
|
||||||
child: controller.loading
|
child: controller.loading
|
||||||
? LinearProgressIndicator()
|
? const LinearProgressIndicator()
|
||||||
: Text(L10n.of(context).signUp),
|
: Text(L10n.of(context).signUp),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -21,7 +21,7 @@ class UserBottomSheetView extends StatelessWidget {
|
|||||||
final client = Matrix.of(context).client;
|
final client = Matrix.of(context).client;
|
||||||
final presence = client.presences[user.id];
|
final presence = client.presences[user.id];
|
||||||
return Center(
|
return Center(
|
||||||
child: Container(
|
child: SizedBox(
|
||||||
width: min(
|
width: min(
|
||||||
MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5),
|
MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5),
|
||||||
child: Material(
|
child: Material(
|
||||||
@ -34,7 +34,7 @@ class UserBottomSheetView extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5),
|
Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.arrow_downward_outlined),
|
icon: const Icon(Icons.arrow_downward_outlined),
|
||||||
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
),
|
),
|
||||||
@ -109,7 +109,7 @@ class UserBottomSheetView extends StatelessWidget {
|
|||||||
ListTile(
|
ListTile(
|
||||||
title: Text(L10n.of(context).username),
|
title: Text(L10n.of(context).username),
|
||||||
subtitle: Text(user.id),
|
subtitle: Text(user.id),
|
||||||
trailing: Icon(Icons.share_outlined),
|
trailing: const Icon(Icons.share_outlined),
|
||||||
onTap: () => FluffyShare.share(
|
onTap: () => FluffyShare.share(
|
||||||
user.id, controller.widget.outerContext),
|
user.id, controller.widget.outerContext),
|
||||||
),
|
),
|
||||||
@ -149,7 +149,7 @@ class _TextWithIcon extends StatelessWidget {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(iconData),
|
Icon(iconData),
|
||||||
SizedBox(width: 16),
|
const SizedBox(width: 16),
|
||||||
Text(text),
|
Text(text),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
|
@ -16,21 +16,21 @@ class VideoViewerView extends StatelessWidget {
|
|||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
elevation: 0,
|
elevation: 0,
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.close),
|
icon: const Icon(Icons.close),
|
||||||
onPressed: Navigator.of(context).pop,
|
onPressed: Navigator.of(context).pop,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
),
|
),
|
||||||
backgroundColor: Color(0x44000000),
|
backgroundColor: const Color(0x44000000),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.reply_outlined),
|
icon: const Icon(Icons.reply_outlined),
|
||||||
onPressed: controller.forwardAction,
|
onPressed: controller.forwardAction,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).share,
|
tooltip: L10n.of(context).share,
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.download_outlined),
|
icon: const Icon(Icons.download_outlined),
|
||||||
onPressed: controller.saveFileAction,
|
onPressed: controller.saveFileAction,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
tooltip: L10n.of(context).downloadFile,
|
tooltip: L10n.of(context).downloadFile,
|
||||||
@ -41,7 +41,7 @@ class VideoViewerView extends StatelessWidget {
|
|||||||
child: controller.error != null
|
child: controller.error != null
|
||||||
? Text(controller.error.toString())
|
? Text(controller.error.toString())
|
||||||
: (controller.chewieController == null
|
: (controller.chewieController == null
|
||||||
? CircularProgressIndicator.adaptive(strokeWidth: 2)
|
? const CircularProgressIndicator.adaptive(strokeWidth: 2)
|
||||||
: Chewie(
|
: Chewie(
|
||||||
controller: controller.chewieController,
|
controller: controller.chewieController,
|
||||||
)),
|
)),
|
||||||
|
@ -97,7 +97,9 @@ class BackgroundPush {
|
|||||||
{final void Function(String errorMsg, {Uri link}) onFcmError}) {
|
{final void Function(String errorMsg, {Uri link}) onFcmError}) {
|
||||||
final instance = BackgroundPush.clientOnly(_client);
|
final instance = BackgroundPush.clientOnly(_client);
|
||||||
instance.context = _context;
|
instance.context = _context;
|
||||||
|
// ignore: prefer_initializing_formals
|
||||||
instance.router = router;
|
instance.router = router;
|
||||||
|
// ignore: prefer_initializing_formals
|
||||||
instance.onFcmError = onFcmError;
|
instance.onFcmError = onFcmError;
|
||||||
instance.fullInit();
|
instance.fullInit();
|
||||||
return instance;
|
return instance;
|
||||||
@ -301,7 +303,7 @@ class BackgroundPush {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
|
// initialise the plugin. app_icon needs to be a added as a drawable resource to the Android head project
|
||||||
final initializationSettingsAndroid =
|
const initializationSettingsAndroid =
|
||||||
AndroidInitializationSettings('notifications_icon');
|
AndroidInitializationSettings('notifications_icon');
|
||||||
final initializationSettingsIOS =
|
final initializationSettingsIOS =
|
||||||
IOSInitializationSettings(onDidReceiveLocalNotification: (i, a, b, c) {
|
IOSInitializationSettings(onDidReceiveLocalNotification: (i, a, b, c) {
|
||||||
@ -596,11 +598,6 @@ class BackgroundPush {
|
|||||||
// load the locale
|
// load the locale
|
||||||
await loadLocale();
|
await loadLocale();
|
||||||
|
|
||||||
// Count all unread events
|
|
||||||
var unreadEvents = 0;
|
|
||||||
client.rooms
|
|
||||||
.forEach((Room room) => unreadEvents += room.notificationCount ?? 0);
|
|
||||||
|
|
||||||
// Calculate title
|
// Calculate title
|
||||||
final title = l10n.unreadMessages(room.notificationCount ?? 0);
|
final title = l10n.unreadMessages(room.notificationCount ?? 0);
|
||||||
|
|
||||||
@ -645,7 +642,7 @@ class BackgroundPush {
|
|||||||
),
|
),
|
||||||
ticker: l10n.newMessageInFluffyChat,
|
ticker: l10n.newMessageInFluffyChat,
|
||||||
);
|
);
|
||||||
final iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
const iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
||||||
final platformChannelSpecifics = NotificationDetails(
|
final platformChannelSpecifics = NotificationDetails(
|
||||||
android: androidPlatformChannelSpecifics,
|
android: androidPlatformChannelSpecifics,
|
||||||
iOS: iOSPlatformChannelSpecifics,
|
iOS: iOSPlatformChannelSpecifics,
|
||||||
@ -681,7 +678,7 @@ class BackgroundPush {
|
|||||||
|
|
||||||
// Display notification
|
// Display notification
|
||||||
final androidPlatformChannelSpecifics = _getAndroidNotificationDetails();
|
final androidPlatformChannelSpecifics = _getAndroidNotificationDetails();
|
||||||
final iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
const iOSPlatformChannelSpecifics = IOSNotificationDetails();
|
||||||
final platformChannelSpecifics = NotificationDetails(
|
final platformChannelSpecifics = NotificationDetails(
|
||||||
android: androidPlatformChannelSpecifics,
|
android: androidPlatformChannelSpecifics,
|
||||||
iOS: iOSPlatformChannelSpecifics,
|
iOS: iOSPlatformChannelSpecifics,
|
||||||
@ -702,7 +699,7 @@ class BackgroundPush {
|
|||||||
AndroidNotificationDetails _getAndroidNotificationDetails(
|
AndroidNotificationDetails _getAndroidNotificationDetails(
|
||||||
{MessagingStyleInformation styleInformation, String ticker}) {
|
{MessagingStyleInformation styleInformation, String ticker}) {
|
||||||
final color = (context != null ? Theme.of(context).primaryColor : null) ??
|
final color = (context != null ? Theme.of(context).primaryColor : null) ??
|
||||||
Color(0xFF5625BA);
|
const Color(0xFF5625BA);
|
||||||
|
|
||||||
return AndroidNotificationDetails(
|
return AndroidNotificationDetails(
|
||||||
AppConfig.pushNotificationsChannelId,
|
AppConfig.pushNotificationsChannelId,
|
||||||
|
@ -22,7 +22,7 @@ extension DateTimeExtension on DateTime {
|
|||||||
/// Two message events can belong to the same environment. That means that they
|
/// Two message events can belong to the same environment. That means that they
|
||||||
/// don't need to display the time they were sent because they are close
|
/// don't need to display the time they were sent because they are close
|
||||||
/// enaugh.
|
/// enaugh.
|
||||||
static final minutesBetweenEnvironments = 5;
|
static const minutesBetweenEnvironments = 5;
|
||||||
|
|
||||||
/// Checks if two DateTimes are close enough to belong to the same
|
/// Checks if two DateTimes are close enough to belong to the same
|
||||||
/// environment.
|
/// environment.
|
||||||
|
@ -31,7 +31,7 @@ class Store {
|
|||||||
static final _mutex = AsyncMutex();
|
static final _mutex = AsyncMutex();
|
||||||
|
|
||||||
Store()
|
Store()
|
||||||
: secureStorage = PlatformInfos.isMobile ? FlutterSecureStorage() : null;
|
: secureStorage = PlatformInfos.isMobile ? const FlutterSecureStorage() : null;
|
||||||
|
|
||||||
Future<void> _setupLocalStorage() async {
|
Future<void> _setupLocalStorage() async {
|
||||||
if (storage == null) {
|
if (storage == null) {
|
||||||
|
@ -55,7 +55,7 @@ class FlutterMatrixHiveStore extends FamedlySdkHiveDatabase {
|
|||||||
// Workaround for secure storage is calling Platform.operatingSystem on web
|
// Workaround for secure storage is calling Platform.operatingSystem on web
|
||||||
if (kIsWeb) throw MissingPluginException();
|
if (kIsWeb) throw MissingPluginException();
|
||||||
|
|
||||||
final secureStorage = const FlutterSecureStorage();
|
const secureStorage = FlutterSecureStorage();
|
||||||
final containsEncryptionKey =
|
final containsEncryptionKey =
|
||||||
await secureStorage.containsKey(key: _hiveCipherStorageKey);
|
await secureStorage.containsKey(key: _hiveCipherStorageKey);
|
||||||
if (!containsEncryptionKey) {
|
if (!containsEncryptionKey) {
|
||||||
|
@ -53,11 +53,11 @@ abstract class PlatformInfos {
|
|||||||
),
|
),
|
||||||
OutlinedButton(
|
OutlinedButton(
|
||||||
onPressed: () => launch(AppConfig.emojiFontUrl),
|
onPressed: () => launch(AppConfig.emojiFontUrl),
|
||||||
child: Text(AppConfig.emojiFontName),
|
child: const Text(AppConfig.emojiFontName),
|
||||||
),
|
),
|
||||||
OutlinedButton(
|
OutlinedButton(
|
||||||
onPressed: () => VRouter.of(context).to('logs'),
|
onPressed: () => VRouter.of(context).to('logs'),
|
||||||
child: Text('Logs'),
|
child: const Text('Logs'),
|
||||||
),
|
),
|
||||||
SentrySwitchListTile(label: L10n.of(context).sendBugReports),
|
SentrySwitchListTile(label: L10n.of(context).sendBugReports),
|
||||||
],
|
],
|
||||||
|
@ -45,8 +45,8 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
|||||||
value: 'mute',
|
value: 'mute',
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.notifications_off_outlined),
|
const Icon(Icons.notifications_off_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).muteChat),
|
Text(L10n.of(context).muteChat),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -55,8 +55,8 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
|||||||
value: 'unmute',
|
value: 'unmute',
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.notifications_on_outlined),
|
const Icon(Icons.notifications_on_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).unmuteChat),
|
Text(L10n.of(context).unmuteChat),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -65,8 +65,8 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
|||||||
value: 'leave',
|
value: 'leave',
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.delete_outlined),
|
const Icon(Icons.delete_outlined),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).leave),
|
Text(L10n.of(context).leave),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -79,8 +79,8 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
|
|||||||
value: 'details',
|
value: 'details',
|
||||||
child: Row(
|
child: Row(
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.info_outline_rounded),
|
const Icon(Icons.info_outline_rounded),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(L10n.of(context).chatDetails),
|
Text(L10n.of(context).chatDetails),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -7,6 +7,8 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||||||
import 'matrix.dart';
|
import 'matrix.dart';
|
||||||
|
|
||||||
class ConnectionStatusHeader extends StatefulWidget {
|
class ConnectionStatusHeader extends StatefulWidget {
|
||||||
|
const ConnectionStatusHeader({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState();
|
_ConnectionStatusHeaderState createState() => _ConnectionStatusHeaderState();
|
||||||
}
|
}
|
||||||
@ -19,7 +21,8 @@ class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
|
|||||||
_lastSyncReceived.millisecondsSinceEpoch <
|
_lastSyncReceived.millisecondsSinceEpoch <
|
||||||
(Matrix.of(context).client.sendMessageTimeoutSeconds + 2) * 1000;
|
(Matrix.of(context).client.sendMessageTimeoutSeconds + 2) * 1000;
|
||||||
static DateTime _lastSyncReceived = DateTime(0);
|
static DateTime _lastSyncReceived = DateTime(0);
|
||||||
SyncStatusUpdate _status = SyncStatusUpdate(SyncStatus.waitingForResponse);
|
SyncStatusUpdate _status =
|
||||||
|
const SyncStatusUpdate(SyncStatus.waitingForResponse);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
@ -44,12 +47,12 @@ class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return AnimatedContainer(
|
return AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 200),
|
duration: const Duration(milliseconds: 200),
|
||||||
curve: Curves.bounceInOut,
|
curve: Curves.bounceInOut,
|
||||||
height: _connected ? 0 : 36,
|
height: _connected ? 0 : 36,
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
decoration: BoxDecoration(color: Theme.of(context).secondaryHeaderColor),
|
decoration: BoxDecoration(color: Theme.of(context).secondaryHeaderColor),
|
||||||
padding: EdgeInsets.symmetric(horizontal: 12),
|
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
@ -61,7 +64,7 @@ class _ConnectionStatusHeaderState extends State<ConnectionStatusHeader> {
|
|||||||
value: _connected ? 1.0 : _status.progress,
|
value: _connected ? 1.0 : _status.progress,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 12),
|
const SizedBox(width: 12),
|
||||||
Text(
|
Text(
|
||||||
_status.toLocalizedString(context),
|
_status.toLocalizedString(context),
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
|
@ -44,7 +44,7 @@ class _ContactsState extends State<ContactsList> {
|
|||||||
_lastSetState.millisecondsSinceEpoch <
|
_lastSetState.millisecondsSinceEpoch <
|
||||||
1000) {
|
1000) {
|
||||||
_coolDown?.cancel();
|
_coolDown?.cancel();
|
||||||
_coolDown = Timer(Duration(seconds: 1), _updateView);
|
_coolDown = Timer(const Duration(seconds: 1), _updateView);
|
||||||
} else {
|
} else {
|
||||||
_updateView();
|
_updateView();
|
||||||
}
|
}
|
||||||
@ -77,7 +77,7 @@ class _ContactListTile extends StatelessWidget {
|
|||||||
snapshot.data?.displayName ?? contact.senderId.localpart;
|
snapshot.data?.displayName ?? contact.senderId.localpart;
|
||||||
final avatarUrl = snapshot.data?.avatarUrl;
|
final avatarUrl = snapshot.data?.avatarUrl;
|
||||||
return ListTile(
|
return ListTile(
|
||||||
leading: Container(
|
leading: SizedBox(
|
||||||
width: Avatar.defaultSize,
|
width: Avatar.defaultSize,
|
||||||
height: Avatar.defaultSize,
|
height: Avatar.defaultSize,
|
||||||
child: Stack(
|
child: Stack(
|
||||||
|
@ -63,14 +63,14 @@ class ContentBanner extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
if (onEdit != null)
|
if (onEdit != null)
|
||||||
Container(
|
Container(
|
||||||
margin: EdgeInsets.all(8),
|
margin: const EdgeInsets.all(8),
|
||||||
alignment: Alignment.bottomRight,
|
alignment: Alignment.bottomRight,
|
||||||
child: FloatingActionButton(
|
child: FloatingActionButton(
|
||||||
mini: true,
|
mini: true,
|
||||||
onPressed: onEdit,
|
onPressed: onEdit,
|
||||||
backgroundColor: Theme.of(context).backgroundColor,
|
backgroundColor: Theme.of(context).backgroundColor,
|
||||||
foregroundColor: Theme.of(context).textTheme.bodyText1.color,
|
foregroundColor: Theme.of(context).textTheme.bodyText1.color,
|
||||||
child: Icon(Icons.camera_alt_outlined),
|
child: const Icon(Icons.camera_alt_outlined),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -18,7 +18,7 @@ class DefaultAppBarSearchField extends StatefulWidget {
|
|||||||
final bool unfocusOnClear;
|
final bool unfocusOnClear;
|
||||||
final bool autocorrect;
|
final bool autocorrect;
|
||||||
|
|
||||||
DefaultAppBarSearchField({
|
const DefaultAppBarSearchField({
|
||||||
Key key,
|
Key key,
|
||||||
this.searchController,
|
this.searchController,
|
||||||
this.onChanged,
|
this.onChanged,
|
||||||
@ -78,7 +78,7 @@ class DefaultAppBarSearchFieldState extends State<DefaultAppBarSearchField> {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Container(
|
return Container(
|
||||||
height: 40,
|
height: 40,
|
||||||
padding: widget.padding ?? EdgeInsets.only(right: 12),
|
padding: widget.padding ?? const EdgeInsets.only(right: 12),
|
||||||
child: TextField(
|
child: TextField(
|
||||||
autofocus: widget.autofocus,
|
autofocus: widget.autofocus,
|
||||||
autocorrect: widget.autocorrect,
|
autocorrect: widget.autocorrect,
|
||||||
@ -97,7 +97,7 @@ class DefaultAppBarSearchFieldState extends State<DefaultAppBarSearchField> {
|
|||||||
borderSide:
|
borderSide:
|
||||||
BorderSide(color: Theme.of(context).secondaryHeaderColor),
|
BorderSide(color: Theme.of(context).secondaryHeaderColor),
|
||||||
),
|
),
|
||||||
contentPadding: EdgeInsets.only(
|
contentPadding: const EdgeInsets.only(
|
||||||
top: 8,
|
top: 8,
|
||||||
bottom: 8,
|
bottom: 8,
|
||||||
left: 16,
|
left: 16,
|
||||||
@ -110,7 +110,7 @@ class DefaultAppBarSearchFieldState extends State<DefaultAppBarSearchField> {
|
|||||||
(_searchController.text?.isNotEmpty ?? false)))
|
(_searchController.text?.isNotEmpty ?? false)))
|
||||||
? IconButton(
|
? IconButton(
|
||||||
tooltip: L10n.of(context).clearText,
|
tooltip: L10n.of(context).clearText,
|
||||||
icon: Icon(Icons.backspace_outlined),
|
icon: const Icon(Icons.backspace_outlined),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
_searchController.clear();
|
_searchController.clear();
|
||||||
widget.onChanged?.call('');
|
widget.onChanged?.call('');
|
||||||
|
@ -132,10 +132,10 @@ class _AudioPlayerState extends State<AudioPlayerWidget> {
|
|||||||
return Row(
|
return Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Container(
|
SizedBox(
|
||||||
width: 30,
|
width: 30,
|
||||||
child: status == AudioPlayerStatus.downloading
|
child: status == AudioPlayerStatus.downloading
|
||||||
? CircularProgressIndicator.adaptive(strokeWidth: 2)
|
? const CircularProgressIndicator.adaptive(strokeWidth: 2)
|
||||||
: IconButton(
|
: IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
audioPlayer.state == PlayerState.PLAYING
|
audioPlayer.state == PlayerState.PLAYING
|
||||||
@ -172,7 +172,7 @@ class _AudioPlayerState extends State<AudioPlayerWidget> {
|
|||||||
color: widget.color,
|
color: widget.color,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
Icons.download_outlined,
|
Icons.download_outlined,
|
||||||
|
@ -18,13 +18,15 @@ class HtmlMessage extends StatelessWidget {
|
|||||||
final TextStyle linkStyle;
|
final TextStyle linkStyle;
|
||||||
final double emoteSize;
|
final double emoteSize;
|
||||||
|
|
||||||
const HtmlMessage(
|
const HtmlMessage({
|
||||||
{this.html,
|
Key key,
|
||||||
|
this.html,
|
||||||
this.maxLines,
|
this.maxLines,
|
||||||
this.room,
|
this.room,
|
||||||
this.defaultTextStyle,
|
this.defaultTextStyle,
|
||||||
this.linkStyle,
|
this.linkStyle,
|
||||||
this.emoteSize});
|
this.emoteSize,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -35,7 +37,7 @@ class HtmlMessage extends StatelessWidget {
|
|||||||
// miss-matching tags, and this way we actually correctly identify what we want to strip and, well,
|
// miss-matching tags, and this way we actually correctly identify what we want to strip and, well,
|
||||||
// strip it.
|
// strip it.
|
||||||
final renderHtml = html.replaceAll(
|
final renderHtml = html.replaceAll(
|
||||||
RegExp('<mx-reply>.*<\/mx-reply>',
|
RegExp('<mx-reply>.*</mx-reply>',
|
||||||
caseSensitive: false, multiLine: false, dotAll: true),
|
caseSensitive: false, multiLine: false, dotAll: true),
|
||||||
'');
|
'');
|
||||||
|
|
||||||
|
@ -205,8 +205,8 @@ class _ImageBubbleState extends State<ImageBubble> {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.download_outlined),
|
const Icon(Icons.download_outlined),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Text(
|
Text(
|
||||||
filename,
|
filename,
|
||||||
overflow: TextOverflow.fade,
|
overflow: TextOverflow.fade,
|
||||||
@ -217,7 +217,7 @@ class _ImageBubbleState extends State<ImageBubble> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (widget.event.sizeString != null) Text(widget.event.sizeString),
|
if (widget.event.sizeString != null) Text(widget.event.sizeString),
|
||||||
SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
Text((error ?? _error).toString()),
|
Text((error ?? _error).toString()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -249,7 +249,7 @@ class _ImageBubbleState extends State<ImageBubble> {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
if (blurhash != null) blurhash,
|
if (blurhash != null) blurhash,
|
||||||
Center(
|
Center(
|
||||||
child: child ?? CircularProgressIndicator.adaptive(strokeWidth: 2),
|
child: child ?? const CircularProgressIndicator.adaptive(strokeWidth: 2),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
@ -412,7 +412,7 @@ class _ImageBubbleState extends State<ImageBubble> {
|
|||||||
child: Hero(
|
child: Hero(
|
||||||
tag: widget.event.eventId,
|
tag: widget.event.eventId,
|
||||||
child: AnimatedSwitcher(
|
child: AnimatedSwitcher(
|
||||||
duration: Duration(milliseconds: 1000),
|
duration: const Duration(milliseconds: 1000),
|
||||||
child: Container(
|
child: Container(
|
||||||
key: ValueKey(key),
|
key: ValueKey(key),
|
||||||
constraints: widget.maxSize
|
constraints: widget.maxSize
|
||||||
|
@ -42,7 +42,7 @@ class MapBubble extends StatelessWidget {
|
|||||||
markers: [
|
markers: [
|
||||||
Marker(
|
Marker(
|
||||||
point: LatLng(latitude, longitude),
|
point: LatLng(latitude, longitude),
|
||||||
builder: (context) => Icon(
|
builder: (context) => const Icon(
|
||||||
Icons.location_pin,
|
Icons.location_pin,
|
||||||
color: Colors.red,
|
color: Colors.red,
|
||||||
),
|
),
|
||||||
|
@ -33,7 +33,9 @@ class Message extends StatelessWidget {
|
|||||||
this.scrollToEventId,
|
this.scrollToEventId,
|
||||||
@required this.unfold,
|
@required this.unfold,
|
||||||
this.selected,
|
this.selected,
|
||||||
this.timeline});
|
this.timeline,
|
||||||
|
Key key})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
/// Indicates wheither the user may use a mouse instead
|
/// Indicates wheither the user may use a mouse instead
|
||||||
/// of touchscreen.
|
/// of touchscreen.
|
||||||
@ -99,8 +101,8 @@ class Message extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
padding:
|
padding:
|
||||||
const EdgeInsets.symmetric(vertical: 6, horizontal: 10),
|
const EdgeInsets.symmetric(vertical: 6, horizontal: 10),
|
||||||
constraints:
|
constraints: const BoxConstraints(
|
||||||
BoxConstraints(maxWidth: FluffyThemes.columnWidth * 1.5),
|
maxWidth: FluffyThemes.columnWidth * 1.5),
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Column(
|
Column(
|
||||||
@ -134,7 +136,8 @@ class Message extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
child: AbsorbPointer(
|
child: AbsorbPointer(
|
||||||
child: Container(
|
child: Container(
|
||||||
margin: EdgeInsets.symmetric(vertical: 4.0),
|
margin: const EdgeInsets.symmetric(
|
||||||
|
vertical: 4.0),
|
||||||
child: ReplyContent(replyEvent,
|
child: ReplyContent(replyEvent,
|
||||||
lightText: ownMessage,
|
lightText: ownMessage,
|
||||||
timeline: timeline),
|
timeline: timeline),
|
||||||
@ -147,7 +150,7 @@ class Message extends StatelessWidget {
|
|||||||
displayEvent,
|
displayEvent,
|
||||||
textColor: textColor,
|
textColor: textColor,
|
||||||
),
|
),
|
||||||
SizedBox(height: 3),
|
const SizedBox(height: 3),
|
||||||
Opacity(
|
Opacity(
|
||||||
opacity: 0,
|
opacity: 0,
|
||||||
child: _MetaRow(
|
child: _MetaRow(
|
||||||
@ -181,7 +184,7 @@ class Message extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
];
|
];
|
||||||
final avatarOrSizedBox = sameSender
|
final avatarOrSizedBox = sameSender
|
||||||
? SizedBox(width: Avatar.defaultSize)
|
? const SizedBox(width: Avatar.defaultSize)
|
||||||
: Avatar(
|
: Avatar(
|
||||||
event.sender.avatarUrl,
|
event.sender.avatarUrl,
|
||||||
event.sender.calcDisplayname(),
|
event.sender.calcDisplayname(),
|
||||||
@ -224,10 +227,11 @@ class Message extends StatelessWidget {
|
|||||||
color: selected
|
color: selected
|
||||||
? Theme.of(context).primaryColor.withAlpha(100)
|
? Theme.of(context).primaryColor.withAlpha(100)
|
||||||
: Theme.of(context).primaryColor.withAlpha(0),
|
: Theme.of(context).primaryColor.withAlpha(0),
|
||||||
constraints: BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5),
|
constraints:
|
||||||
|
const BoxConstraints(maxWidth: FluffyThemes.columnWidth * 2.5),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding:
|
padding: const EdgeInsets.only(
|
||||||
EdgeInsets.only(left: 8.0, right: 8.0, bottom: 4.0, top: 4.0),
|
left: 8.0, right: 8.0, bottom: 4.0, top: 4.0),
|
||||||
child: container,
|
child: container,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
@ -267,7 +271,7 @@ class _MetaRow extends StatelessWidget {
|
|||||||
.withAlpha(200),
|
.withAlpha(200),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (showDisplayname) SizedBox(width: 4),
|
if (showDisplayname) const SizedBox(width: 4),
|
||||||
Text(
|
Text(
|
||||||
event.originServerTs.localizedTime(context),
|
event.originServerTs.localizedTime(context),
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
@ -284,7 +288,7 @@ class _MetaRow extends StatelessWidget {
|
|||||||
color: color,
|
color: color,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (ownMessage) SizedBox(width: 2),
|
if (ownMessage) const SizedBox(width: 2),
|
||||||
if (ownMessage)
|
if (ownMessage)
|
||||||
Icon(
|
Icon(
|
||||||
displayEvent.statusIcon,
|
displayEvent.statusIcon,
|
||||||
|
@ -26,7 +26,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
final Event event;
|
final Event event;
|
||||||
final Color textColor;
|
final Color textColor;
|
||||||
|
|
||||||
const MessageContent(this.event, {this.textColor});
|
const MessageContent(this.event, {Key key,this.textColor}) : super(key: key);
|
||||||
|
|
||||||
void _verifyOrRequestKey(BuildContext context) async {
|
void _verifyOrRequestKey(BuildContext context) async {
|
||||||
if (event.content['can_request_session'] != true) {
|
if (event.content['can_request_session'] != true) {
|
||||||
@ -50,7 +50,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
if (await client.encryption.keyManager.isCached()) {
|
if (await client.encryption.keyManager.isCached()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
await Future.delayed(Duration(seconds: 1));
|
await Future.delayed(const Duration(seconds: 1));
|
||||||
}
|
}
|
||||||
final timeline = await event.room.getTimeline();
|
final timeline = await event.room.getTimeline();
|
||||||
timeline.requestKeys();
|
timeline.requestKeys();
|
||||||
@ -121,7 +121,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
tapToView: false,
|
tapToView: false,
|
||||||
),
|
),
|
||||||
Icon(Icons.play_circle_outline,
|
const Icon(Icons.play_circle_outline,
|
||||||
size: 200, color: Colors.grey),
|
size: 200, color: Colors.grey),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -169,7 +169,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
onPrimary: Theme.of(context).textTheme.bodyText1.color,
|
onPrimary: Theme.of(context).textTheme.bodyText1.color,
|
||||||
),
|
),
|
||||||
onPressed: () => _verifyOrRequestKey(context),
|
onPressed: () => _verifyOrRequestKey(context),
|
||||||
icon: Icon(Icons.lock_outline),
|
icon: const Icon(Icons.lock_outline),
|
||||||
label: Text(L10n.of(context).encrypted),
|
label: Text(L10n.of(context).encrypted),
|
||||||
);
|
);
|
||||||
case MessageTypes.Location:
|
case MessageTypes.Location:
|
||||||
@ -194,7 +194,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
latitude: latlong.first,
|
latitude: latlong.first,
|
||||||
longitude: latlong.last,
|
longitude: latlong.last,
|
||||||
),
|
),
|
||||||
SizedBox(height: 6),
|
const SizedBox(height: 6),
|
||||||
OutlinedButton.icon(
|
OutlinedButton.icon(
|
||||||
icon: Icon(Icons.location_on_outlined, color: textColor),
|
icon: Icon(Icons.location_on_outlined, color: textColor),
|
||||||
onPressed:
|
onPressed:
|
||||||
@ -219,7 +219,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
onPrimary: Theme.of(context).textTheme.bodyText1.color,
|
onPrimary: Theme.of(context).textTheme.bodyText1.color,
|
||||||
),
|
),
|
||||||
onPressed: () => launch(event.body),
|
onPressed: () => launch(event.body),
|
||||||
icon: Icon(Icons.phone_outlined, color: Colors.green),
|
icon: const Icon(Icons.phone_outlined, color: Colors.green),
|
||||||
label: Text(L10n.of(context).videoCall),
|
label: Text(L10n.of(context).videoCall),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -228,7 +228,7 @@ class MessageContent extends StatelessWidget {
|
|||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.delete_forever_outlined, color: textColor),
|
Icon(Icons.delete_forever_outlined, color: textColor),
|
||||||
SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
Text(
|
Text(
|
||||||
event.getLocalizedBody(MatrixLocals(L10n.of(context)),
|
event.getLocalizedBody(MatrixLocals(L10n.of(context)),
|
||||||
hideReply: true),
|
hideReply: true),
|
||||||
|
@ -14,8 +14,7 @@ class MessageDownloadContent extends StatelessWidget {
|
|||||||
final String filename = event.content.containsKey('filename')
|
final String filename = event.content.containsKey('filename')
|
||||||
? event.content['filename']
|
? event.content['filename']
|
||||||
: event.body;
|
: event.body;
|
||||||
return Container(
|
return Column(
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
@ -28,8 +27,8 @@ class MessageDownloadContent extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisSize: MainAxisSize.min,
|
mainAxisSize: MainAxisSize.min,
|
||||||
children: [
|
children: [
|
||||||
Icon(Icons.download_outlined),
|
const Icon(Icons.download_outlined),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
filename,
|
filename,
|
||||||
@ -49,7 +48,6 @@ class MessageDownloadContent extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,8 @@ class MessageReactions extends StatelessWidget {
|
|||||||
final Event event;
|
final Event event;
|
||||||
final Timeline timeline;
|
final Timeline timeline;
|
||||||
|
|
||||||
const MessageReactions(this.event, this.timeline);
|
const MessageReactions(this.event, this.timeline, {Key key})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
@ -74,7 +74,7 @@ class ReplyContent extends StatelessWidget {
|
|||||||
height: fontSize * 2 + 6,
|
height: fontSize * 2 + 6,
|
||||||
color: lightText ? Colors.white : Theme.of(context).primaryColor,
|
color: lightText ? Colors.white : Theme.of(context).primaryColor,
|
||||||
),
|
),
|
||||||
SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
Flexible(
|
Flexible(
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
@ -8,7 +8,8 @@ import '../../config/app_config.dart';
|
|||||||
class StateMessage extends StatelessWidget {
|
class StateMessage extends StatelessWidget {
|
||||||
final Event event;
|
final Event event;
|
||||||
final void Function(String) unfold;
|
final void Function(String) unfold;
|
||||||
const StateMessage(this.event, {@required this.unfold});
|
const StateMessage(this.event, {@required this.unfold, Key key})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -52,7 +53,7 @@ class StateMessage extends StatelessWidget {
|
|||||||
if (counter != 0)
|
if (counter != 0)
|
||||||
Text(
|
Text(
|
||||||
L10n.of(context).moreEvents(counter),
|
L10n.of(context).moreEvents(counter),
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontWeight: FontWeight.bold,
|
fontWeight: FontWeight.bold,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
@ -8,7 +8,8 @@ class VerificationRequestContent extends StatelessWidget {
|
|||||||
final Event event;
|
final Event event;
|
||||||
final Timeline timeline;
|
final Timeline timeline;
|
||||||
|
|
||||||
const VerificationRequestContent({this.event, this.timeline});
|
const VerificationRequestContent({this.event, this.timeline, Key key})
|
||||||
|
: super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -22,13 +23,13 @@ class VerificationRequestContent extends StatelessWidget {
|
|||||||
final started = start.isNotEmpty;
|
final started = start.isNotEmpty;
|
||||||
final canceled = cancel.isNotEmpty;
|
final canceled = cancel.isNotEmpty;
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: 8.0,
|
horizontal: 8.0,
|
||||||
vertical: 4.0,
|
vertical: 4.0,
|
||||||
),
|
),
|
||||||
child: Center(
|
child: Center(
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.all(8),
|
padding: const EdgeInsets.all(8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
color: Theme.of(context).dividerColor,
|
color: Theme.of(context).dividerColor,
|
||||||
@ -44,7 +45,7 @@ class VerificationRequestContent extends StatelessWidget {
|
|||||||
color: canceled
|
color: canceled
|
||||||
? Colors.red
|
? Colors.red
|
||||||
: (fullyDone ? Colors.green : Colors.grey)),
|
: (fullyDone ? Colors.green : Colors.grey)),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Text(canceled
|
Text(canceled
|
||||||
? 'Error ${cancel.first.content.tryGet<String>('code')}: ${cancel.first.content.tryGet<String>('reason')}'
|
? 'Error ${cancel.first.content.tryGet<String>('code')}: ${cancel.first.content.tryGet<String>('reason')}'
|
||||||
: (fullyDone
|
: (fullyDone
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class FluffyBanner extends StatelessWidget {
|
class FluffyBanner extends StatelessWidget {
|
||||||
|
const FluffyBanner({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Image.asset(Theme.of(context).brightness == Brightness.dark
|
return Image.asset(Theme.of(context).brightness == Brightness.dark
|
||||||
|
@ -24,7 +24,7 @@ class InputBar extends StatelessWidget {
|
|||||||
final ValueChanged<String> onChanged;
|
final ValueChanged<String> onChanged;
|
||||||
final bool autofocus;
|
final bool autofocus;
|
||||||
|
|
||||||
InputBar({
|
const InputBar({
|
||||||
this.room,
|
this.room,
|
||||||
this.minLines,
|
this.minLines,
|
||||||
this.maxLines,
|
this.maxLines,
|
||||||
@ -36,7 +36,8 @@ class InputBar extends StatelessWidget {
|
|||||||
this.onChanged,
|
this.onChanged,
|
||||||
this.autofocus,
|
this.autofocus,
|
||||||
this.textInputAction,
|
this.textInputAction,
|
||||||
});
|
Key key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
List<Map<String, String>> getSuggestions(String text) {
|
List<Map<String, String>> getSuggestions(String text) {
|
||||||
if (controller.selection.baseOffset != controller.selection.extentOffset ||
|
if (controller.selection.baseOffset != controller.selection.extentOffset ||
|
||||||
@ -220,7 +221,7 @@ class InputBar extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text('/' + command, style: TextStyle(fontFamily: 'monospace')),
|
Text('/' + command, style: const TextStyle(fontFamily: 'monospace')),
|
||||||
Text(_commandHint(L10n.of(context), command),
|
Text(_commandHint(L10n.of(context), command),
|
||||||
style: Theme.of(context).textTheme.caption),
|
style: Theme.of(context).textTheme.caption),
|
||||||
],
|
],
|
||||||
@ -246,7 +247,7 @@ class InputBar extends StatelessWidget {
|
|||||||
width: size,
|
width: size,
|
||||||
height: size,
|
height: size,
|
||||||
),
|
),
|
||||||
SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
Text(suggestion['name']),
|
Text(suggestion['name']),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Align(
|
child: Align(
|
||||||
@ -281,7 +282,7 @@ class InputBar extends StatelessWidget {
|
|||||||
size: size,
|
size: size,
|
||||||
client: client,
|
client: client,
|
||||||
),
|
),
|
||||||
SizedBox(width: 6),
|
const SizedBox(width: 6),
|
||||||
Text(suggestion['displayname'] ?? suggestion['mxid']),
|
Text(suggestion['displayname'] ?? suggestion['mxid']),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@ -395,7 +396,7 @@ class InputBar extends StatelessWidget {
|
|||||||
hideOnEmpty: true,
|
hideOnEmpty: true,
|
||||||
hideOnLoading: true,
|
hideOnLoading: true,
|
||||||
keepSuggestionsOnSuggestionSelected: true,
|
keepSuggestionsOnSuggestionSelected: true,
|
||||||
debounceDuration: Duration(
|
debounceDuration: const Duration(
|
||||||
milliseconds:
|
milliseconds:
|
||||||
50), // show suggestions after 50ms idle time (default is 300)
|
50), // show suggestions after 50ms idle time (default is 300)
|
||||||
textFieldConfiguration: TextFieldConfiguration(
|
textFieldConfiguration: TextFieldConfiguration(
|
||||||
|
@ -5,6 +5,8 @@ import 'package:fluffychat/widgets/matrix.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class LoadingView extends StatelessWidget {
|
class LoadingView extends StatelessWidget {
|
||||||
|
const LoadingView({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
if (Matrix.of(context)
|
if (Matrix.of(context)
|
||||||
@ -23,6 +25,6 @@ class LoadingView extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return EmptyPage(loading: true);
|
return const EmptyPage(loading: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ class MaxWidthBody extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
return withScrolling
|
return withScrolling
|
||||||
? SingleChildScrollView(
|
? SingleChildScrollView(
|
||||||
physics: ScrollPhysics(),
|
physics: const ScrollPhysics(),
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: padding,
|
padding: padding,
|
||||||
child: child,
|
child: child,
|
||||||
|
@ -17,7 +17,7 @@ class OnePageCard extends StatelessWidget {
|
|||||||
Matrix.of(context).client.isLogged()
|
Matrix.of(context).client.isLogged()
|
||||||
? child
|
? child
|
||||||
: Container(
|
: Container(
|
||||||
decoration: BoxDecoration(
|
decoration: const BoxDecoration(
|
||||||
image: DecorationImage(
|
image: DecorationImage(
|
||||||
image: AssetImage('assets/login_wallpaper.jpg'),
|
image: AssetImage('assets/login_wallpaper.jpg'),
|
||||||
fit: BoxFit.cover,
|
fit: BoxFit.cover,
|
||||||
|
@ -28,9 +28,9 @@ class SideViewLayout extends StatelessWidget {
|
|||||||
color: Theme.of(context).dividerColor,
|
color: Theme.of(context).dividerColor,
|
||||||
),
|
),
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
decoration: BoxDecoration(),
|
decoration: const BoxDecoration(),
|
||||||
width: hideSideView ? 0 : 360.0,
|
width: hideSideView ? 0 : 360.0,
|
||||||
child: hideSideView ? null : sideView,
|
child: hideSideView ? null : sideView,
|
||||||
),
|
),
|
||||||
|
@ -19,7 +19,7 @@ class TwoColumnLayout extends StatelessWidget {
|
|||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
clipBehavior: Clip.antiAlias,
|
clipBehavior: Clip.antiAlias,
|
||||||
decoration: BoxDecoration(),
|
decoration: const BoxDecoration(),
|
||||||
width: 360.0,
|
width: 360.0,
|
||||||
child: mainView,
|
child: mainView,
|
||||||
),
|
),
|
||||||
|
@ -27,14 +27,17 @@ class ChatListItem extends StatelessWidget {
|
|||||||
final Function onTap;
|
final Function onTap;
|
||||||
final Function onLongPress;
|
final Function onLongPress;
|
||||||
|
|
||||||
const ChatListItem(this.room,
|
const ChatListItem(
|
||||||
{this.activeChat = false,
|
this.room, {
|
||||||
|
this.activeChat = false,
|
||||||
this.selected = false,
|
this.selected = false,
|
||||||
this.onTap,
|
this.onTap,
|
||||||
this.onLongPress,
|
this.onLongPress,
|
||||||
this.onForget});
|
this.onForget,
|
||||||
|
Key key,
|
||||||
|
}) : super(key: key);
|
||||||
|
|
||||||
void clickAction(BuildContext context) async {
|
dynamic clickAction(BuildContext context) async {
|
||||||
if (onTap != null) return onTap();
|
if (onTap != null) return onTap();
|
||||||
if (!activeChat) {
|
if (!activeChat) {
|
||||||
if (room.membership == Membership.invite &&
|
if (room.membership == Membership.invite &&
|
||||||
@ -161,13 +164,13 @@ class ChatListItem extends StatelessWidget {
|
|||||||
: Theme.of(context).secondaryHeaderColor,
|
: Theme.of(context).secondaryHeaderColor,
|
||||||
onLongPress: onLongPress,
|
onLongPress: onLongPress,
|
||||||
leading: selected
|
leading: selected
|
||||||
? Container(
|
? SizedBox(
|
||||||
width: Avatar.defaultSize,
|
width: Avatar.defaultSize,
|
||||||
height: Avatar.defaultSize,
|
height: Avatar.defaultSize,
|
||||||
child: Material(
|
child: Material(
|
||||||
color: Theme.of(context).primaryColor,
|
color: Theme.of(context).primaryColor,
|
||||||
borderRadius: BorderRadius.circular(Avatar.defaultSize),
|
borderRadius: BorderRadius.circular(Avatar.defaultSize),
|
||||||
child: Icon(Icons.check, color: Colors.white),
|
child: const Icon(Icons.check, color: Colors.white),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
: Avatar(room.avatar, room.displayname, onTap: onLongPress),
|
: Avatar(room.avatar, room.displayname, onTap: onLongPress),
|
||||||
@ -188,8 +191,8 @@ class ChatListItem extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (isMuted)
|
if (isMuted)
|
||||||
Padding(
|
const Padding(
|
||||||
padding: const EdgeInsets.only(left: 4.0),
|
padding: EdgeInsets.only(left: 4.0),
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.notifications_off_outlined,
|
Icons.notifications_off_outlined,
|
||||||
size: 16,
|
size: 16,
|
||||||
@ -227,15 +230,15 @@ class ChatListItem extends StatelessWidget {
|
|||||||
room.lastEvent.statusIcon,
|
room.lastEvent.statusIcon,
|
||||||
size: 14,
|
size: 14,
|
||||||
),
|
),
|
||||||
SizedBox(width: 4),
|
const SizedBox(width: 4),
|
||||||
},
|
},
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
width: typingText.isEmpty ? 0 : 18,
|
width: typingText.isEmpty ? 0 : 18,
|
||||||
clipBehavior: Clip.hardEdge,
|
clipBehavior: Clip.hardEdge,
|
||||||
decoration: BoxDecoration(),
|
decoration: const BoxDecoration(),
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
curve: Curves.bounceInOut,
|
curve: Curves.bounceInOut,
|
||||||
padding: EdgeInsets.only(right: 4),
|
padding: const EdgeInsets.only(right: 4),
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.edit_outlined,
|
Icons.edit_outlined,
|
||||||
color: Theme.of(context).colorScheme.secondary,
|
color: Theme.of(context).colorScheme.secondary,
|
||||||
@ -286,11 +289,11 @@ class ChatListItem extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
AnimatedContainer(
|
AnimatedContainer(
|
||||||
duration: Duration(milliseconds: 300),
|
duration: const Duration(milliseconds: 300),
|
||||||
curve: Curves.bounceInOut,
|
curve: Curves.bounceInOut,
|
||||||
padding: EdgeInsets.symmetric(horizontal: 7),
|
padding: const EdgeInsets.symmetric(horizontal: 7),
|
||||||
height: unreadBubbleSize,
|
height: unreadBubbleSize,
|
||||||
width: room.notificationCount == 0 && !unread
|
width: room.notificationCount == 0 && !unread
|
||||||
? 0
|
? 0
|
||||||
@ -307,7 +310,7 @@ class ChatListItem extends StatelessWidget {
|
|||||||
child: room.notificationCount > 0
|
child: room.notificationCount > 0
|
||||||
? Text(
|
? Text(
|
||||||
room.notificationCount.toString(),
|
room.notificationCount.toString(),
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
fontSize: 13,
|
fontSize: 13,
|
||||||
),
|
),
|
||||||
|
@ -8,7 +8,7 @@ import '../../pages/user_bottom_sheet.dart';
|
|||||||
class ParticipantListItem extends StatelessWidget {
|
class ParticipantListItem extends StatelessWidget {
|
||||||
final User user;
|
final User user;
|
||||||
|
|
||||||
const ParticipantListItem(this.user);
|
const ParticipantListItem(this.user, {Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -38,8 +38,8 @@ class ParticipantListItem extends StatelessWidget {
|
|||||||
permissionBatch.isEmpty
|
permissionBatch.isEmpty
|
||||||
? Container()
|
? Container()
|
||||||
: Container(
|
: Container(
|
||||||
padding: EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
margin: EdgeInsets.symmetric(horizontal: 8),
|
margin: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
@ -49,8 +49,8 @@ class ParticipantListItem extends StatelessWidget {
|
|||||||
membershipBatch[user.membership].isEmpty
|
membershipBatch[user.membership].isEmpty
|
||||||
? Container()
|
? Container()
|
||||||
: Container(
|
: Container(
|
||||||
padding: EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
margin: EdgeInsets.symmetric(horizontal: 8),
|
margin: const EdgeInsets.symmetric(horizontal: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
|
@ -69,13 +69,13 @@ class PermissionsListTile extends StatelessWidget {
|
|||||||
leading: CircleAvatar(
|
leading: CircleAvatar(
|
||||||
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
backgroundColor: Theme.of(context).scaffoldBackgroundColor,
|
||||||
foregroundColor: Colors.grey,
|
foregroundColor: Colors.grey,
|
||||||
child: Icon(Icons.edit_attributes_outlined),
|
child: const Icon(Icons.edit_attributes_outlined),
|
||||||
),
|
),
|
||||||
title: Text(getLocalizedPowerLevelString(context)),
|
title: Text(getLocalizedPowerLevelString(context)),
|
||||||
subtitle: Row(
|
subtitle: Row(
|
||||||
children: [
|
children: [
|
||||||
Container(
|
Container(
|
||||||
padding: EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).secondaryHeaderColor,
|
color: Theme.of(context).secondaryHeaderColor,
|
||||||
borderRadius: BorderRadius.circular(8),
|
borderRadius: BorderRadius.circular(8),
|
||||||
@ -84,7 +84,7 @@ class PermissionsListTile extends StatelessWidget {
|
|||||||
child: Text(permission.toString()),
|
child: Text(permission.toString()),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(width: 8),
|
const SizedBox(width: 8),
|
||||||
Text(permission.toLocalizedPowerLevelString(context)),
|
Text(permission.toLocalizedPowerLevelString(context)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -110,7 +110,7 @@ class UserDeviceListItem extends StatelessWidget {
|
|||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
overflow: TextOverflow.ellipsis,
|
overflow: TextOverflow.ellipsis,
|
||||||
),
|
),
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
if (userDevice.lastSeenTs != null)
|
if (userDevice.lastSeenTs != null)
|
||||||
Text(DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs)
|
Text(DateTime.fromMillisecondsSinceEpoch(userDevice.lastSeenTs)
|
||||||
.localizedTimeShort(context)),
|
.localizedTimeShort(context)),
|
||||||
@ -120,9 +120,9 @@ class UserDeviceListItem extends StatelessWidget {
|
|||||||
children: <Widget>[
|
children: <Widget>[
|
||||||
Text(
|
Text(
|
||||||
userDevice.deviceId,
|
userDevice.deviceId,
|
||||||
style: TextStyle(fontWeight: FontWeight.w300),
|
style: const TextStyle(fontWeight: FontWeight.w300),
|
||||||
),
|
),
|
||||||
Spacer(),
|
const Spacer(),
|
||||||
if (keys != null)
|
if (keys != null)
|
||||||
Text(
|
Text(
|
||||||
keys.blocked
|
keys.blocked
|
||||||
|
@ -10,6 +10,8 @@ import 'package:flutter_gen/gen_l10n/l10n.dart';
|
|||||||
import 'layouts/one_page_card.dart';
|
import 'layouts/one_page_card.dart';
|
||||||
|
|
||||||
class LockScreen extends StatefulWidget {
|
class LockScreen extends StatefulWidget {
|
||||||
|
const LockScreen({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_LockScreenState createState() => _LockScreenState();
|
_LockScreenState createState() => _LockScreenState();
|
||||||
}
|
}
|
||||||
@ -42,7 +44,7 @@ class _LockScreenState extends State<LockScreen> {
|
|||||||
gradient: LinearGradient(
|
gradient: LinearGradient(
|
||||||
begin: Alignment.topRight,
|
begin: Alignment.topRight,
|
||||||
end: Alignment.bottomLeft,
|
end: Alignment.bottomLeft,
|
||||||
stops: [
|
stops: const [
|
||||||
0.1,
|
0.1,
|
||||||
0.4,
|
0.4,
|
||||||
0.6,
|
0.6,
|
||||||
@ -62,12 +64,12 @@ class _LockScreenState extends State<LockScreen> {
|
|||||||
controller: _textEditingController,
|
controller: _textEditingController,
|
||||||
focusNode: _focusNode,
|
focusNode: _focusNode,
|
||||||
pinBoxRadius: AppConfig.borderRadius,
|
pinBoxRadius: AppConfig.borderRadius,
|
||||||
pinTextStyle: TextStyle(fontSize: 32),
|
pinTextStyle: const TextStyle(fontSize: 32),
|
||||||
hideCharacter: true,
|
hideCharacter: true,
|
||||||
hasError: _wrongInput,
|
hasError: _wrongInput,
|
||||||
onDone: (String input) async {
|
onDone: (String input) async {
|
||||||
if (input ==
|
if (input ==
|
||||||
await FlutterSecureStorage()
|
await const FlutterSecureStorage()
|
||||||
.read(key: SettingKeys.appLockKey)) {
|
.read(key: SettingKeys.appLockKey)) {
|
||||||
AppLock.of(context).didUnlock();
|
AppLock.of(context).didUnlock();
|
||||||
} else {
|
} else {
|
||||||
|
@ -2,6 +2,8 @@ import 'package:matrix/matrix.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
class LogViewer extends StatefulWidget {
|
class LogViewer extends StatefulWidget {
|
||||||
|
const LogViewer({Key key}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
_LogViewerState createState() => _LogViewerState();
|
_LogViewerState createState() => _LogViewerState();
|
||||||
}
|
}
|
||||||
@ -19,14 +21,14 @@ class _LogViewerState extends State<LogViewer> {
|
|||||||
backgroundColor: Colors.black,
|
backgroundColor: Colors.black,
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: Text(logLevel.toString()),
|
title: Text(logLevel.toString()),
|
||||||
leading: BackButton(),
|
leading: const BackButton(),
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.zoom_in_outlined),
|
icon: const Icon(Icons.zoom_in_outlined),
|
||||||
onPressed: () => setState(() => fontSize++),
|
onPressed: () => setState(() => fontSize++),
|
||||||
),
|
),
|
||||||
IconButton(
|
IconButton(
|
||||||
icon: Icon(Icons.zoom_out_outlined),
|
icon: const Icon(Icons.zoom_out_outlined),
|
||||||
onPressed: () => setState(() => fontSize--),
|
onPressed: () => setState(() => fontSize--),
|
||||||
),
|
),
|
||||||
PopupMenuButton<Level>(
|
PopupMenuButton<Level>(
|
||||||
|
@ -41,7 +41,7 @@ class Matrix extends StatefulWidget {
|
|||||||
|
|
||||||
final Map<String, String> queryParameters;
|
final Map<String, String> queryParameters;
|
||||||
|
|
||||||
Matrix({
|
const Matrix({
|
||||||
this.child,
|
this.child,
|
||||||
@required this.router,
|
@required this.router,
|
||||||
@required this.context,
|
@required this.context,
|
||||||
@ -209,7 +209,7 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
|||||||
|
|
||||||
set cachedPassword(String p) => _cachedPassword = p;
|
set cachedPassword(String p) => _cachedPassword = p;
|
||||||
|
|
||||||
void _onUiaRequest(UiaRequest uiaRequest) async {
|
Future _onUiaRequest(UiaRequest uiaRequest) async {
|
||||||
try {
|
try {
|
||||||
if (uiaRequest.state != UiaRequestState.waitForUser ||
|
if (uiaRequest.state != UiaRequestState.waitForUser ||
|
||||||
uiaRequest.nextStages.isEmpty) return;
|
uiaRequest.nextStages.isEmpty) return;
|
||||||
@ -224,7 +224,7 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
|||||||
okLabel: L10n.of(widget.context).ok,
|
okLabel: L10n.of(widget.context).ok,
|
||||||
cancelLabel: L10n.of(widget.context).cancel,
|
cancelLabel: L10n.of(widget.context).cancel,
|
||||||
textFields: [
|
textFields: [
|
||||||
DialogTextField(
|
const DialogTextField(
|
||||||
minLines: 1,
|
minLines: 1,
|
||||||
maxLines: 1,
|
maxLines: 1,
|
||||||
obscureText: true,
|
obscureText: true,
|
||||||
@ -481,7 +481,9 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
|||||||
// Display the app lock
|
// Display the app lock
|
||||||
if (PlatformInfos.isMobile) {
|
if (PlatformInfos.isMobile) {
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
FlutterSecureStorage().read(key: SettingKeys.appLockKey).then((lock) {
|
const FlutterSecureStorage()
|
||||||
|
.read(key: SettingKeys.appLockKey)
|
||||||
|
.then((lock) {
|
||||||
if (lock?.isNotEmpty ?? false) {
|
if (lock?.isNotEmpty ?? false) {
|
||||||
AppLock.of(widget.context).enable();
|
AppLock.of(widget.context).enable();
|
||||||
AppLock.of(widget.context).showLockScreen();
|
AppLock.of(widget.context).showLockScreen();
|
||||||
@ -507,11 +509,11 @@ class MatrixState extends State<Matrix> with WidgetsBindingObserver {
|
|||||||
context,
|
context,
|
||||||
widget.router,
|
widget.router,
|
||||||
onFcmError: (errorMsg, {Uri link}) => Timer(
|
onFcmError: (errorMsg, {Uri link}) => Timer(
|
||||||
Duration(seconds: 1),
|
const Duration(seconds: 1),
|
||||||
() {
|
() {
|
||||||
final banner = SnackBar(
|
final banner = SnackBar(
|
||||||
content: Text(errorMsg),
|
content: Text(errorMsg),
|
||||||
duration: Duration(seconds: 30),
|
duration: const Duration(seconds: 30),
|
||||||
action: link == null
|
action: link == null
|
||||||
? null
|
? null
|
||||||
: SnackBarAction(
|
: SnackBarAction(
|
||||||
|
@ -45,7 +45,7 @@ class ProfileBottomSheet extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Center(
|
return Center(
|
||||||
child: Container(
|
child: SizedBox(
|
||||||
width: min(
|
width: min(
|
||||||
MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5),
|
MediaQuery.of(context).size.width, FluffyThemes.columnWidth * 1.5),
|
||||||
child: Material(
|
child: Material(
|
||||||
@ -58,7 +58,7 @@ class ProfileBottomSheet extends StatelessWidget {
|
|||||||
backgroundColor:
|
backgroundColor:
|
||||||
Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5),
|
Theme.of(context).scaffoldBackgroundColor.withOpacity(0.5),
|
||||||
leading: IconButton(
|
leading: IconButton(
|
||||||
icon: Icon(Icons.arrow_downward_outlined),
|
icon: const Icon(Icons.arrow_downward_outlined),
|
||||||
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
onPressed: Navigator.of(context, rootNavigator: false).pop,
|
||||||
tooltip: L10n.of(context).close,
|
tooltip: L10n.of(context).close,
|
||||||
),
|
),
|
||||||
@ -79,7 +79,7 @@ class ProfileBottomSheet extends StatelessWidget {
|
|||||||
child: snapshot.hasError
|
child: snapshot.hasError
|
||||||
? Text(snapshot.error
|
? Text(snapshot.error
|
||||||
.toLocalizedString(context))
|
.toLocalizedString(context))
|
||||||
: CircularProgressIndicator.adaptive(
|
: const CircularProgressIndicator.adaptive(
|
||||||
strokeWidth: 2),
|
strokeWidth: 2),
|
||||||
)
|
)
|
||||||
: ContentBanner(
|
: ContentBanner(
|
||||||
@ -91,18 +91,18 @@ class ProfileBottomSheet extends StatelessWidget {
|
|||||||
ListTile(
|
ListTile(
|
||||||
title: Text(profile?.displayName ?? userId.localpart),
|
title: Text(profile?.displayName ?? userId.localpart),
|
||||||
subtitle: Text(userId),
|
subtitle: Text(userId),
|
||||||
trailing: Icon(Icons.account_box_outlined),
|
trailing: const Icon(Icons.account_box_outlined),
|
||||||
),
|
),
|
||||||
Container(
|
Container(
|
||||||
width: double.infinity,
|
width: double.infinity,
|
||||||
padding: EdgeInsets.all(12),
|
padding: const EdgeInsets.all(12),
|
||||||
child: ElevatedButton.icon(
|
child: ElevatedButton.icon(
|
||||||
onPressed: () => _startDirectChat(context),
|
onPressed: () => _startDirectChat(context),
|
||||||
label: Text(L10n.of(context).newChat),
|
label: Text(L10n.of(context).newChat),
|
||||||
icon: Icon(Icons.send_outlined),
|
icon: const Icon(Icons.send_outlined),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
@ -16,7 +16,7 @@ class UnreadBadgeBackButton extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
Center(child: BackButton()),
|
const Center(child: BackButton()),
|
||||||
StreamBuilder(
|
StreamBuilder(
|
||||||
stream: Matrix.of(context).client.onSync.stream,
|
stream: Matrix.of(context).client.onSync.stream,
|
||||||
builder: (context, _) {
|
builder: (context, _) {
|
||||||
@ -31,8 +31,8 @@ class UnreadBadgeBackButton extends StatelessWidget {
|
|||||||
? Align(
|
? Align(
|
||||||
alignment: Alignment.bottomRight,
|
alignment: Alignment.bottomRight,
|
||||||
child: Container(
|
child: Container(
|
||||||
padding: EdgeInsets.all(4),
|
padding: const EdgeInsets.all(4),
|
||||||
margin: EdgeInsets.only(bottom: 4, right: 8),
|
margin: const EdgeInsets.only(bottom: 4, right: 8),
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
color: Theme.of(context).primaryColor,
|
color: Theme.of(context).primaryColor,
|
||||||
borderRadius:
|
borderRadius:
|
||||||
@ -40,7 +40,7 @@ class UnreadBadgeBackButton extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
child: Text(
|
child: Text(
|
||||||
'$unreadCount',
|
'$unreadCount',
|
||||||
style: TextStyle(
|
style: const TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: Colors.white,
|
color: Colors.white,
|
||||||
),
|
),
|
||||||
|
16
pubspec.lock
16
pubspec.lock
@ -384,6 +384,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
|
flutter_lints:
|
||||||
|
dependency: "direct dev"
|
||||||
|
description:
|
||||||
|
name: flutter_lints
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.4"
|
||||||
flutter_local_notifications:
|
flutter_local_notifications:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -665,6 +672,13 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.0"
|
version: "0.8.0"
|
||||||
|
lints:
|
||||||
|
dependency: transitive
|
||||||
|
description:
|
||||||
|
name: lints
|
||||||
|
url: "https://pub.dartlang.org"
|
||||||
|
source: hosted
|
||||||
|
version: "1.0.1"
|
||||||
lists:
|
lists:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -913,7 +927,7 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "2.0.0"
|
version: "2.0.0"
|
||||||
pedantic:
|
pedantic:
|
||||||
dependency: "direct dev"
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pedantic
|
name: pedantic
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user