Merge remote-tracking branch 'origin/master' into fileUpload

This commit is contained in:
Elias Müller 2023-05-26 23:22:00 +02:00
commit fb539fb5d9
12 changed files with 352 additions and 79 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

View File

@ -44,6 +44,7 @@ class _AppState extends State<App> {
context, context,
controller: tabController, controller: tabController,
navBarStyle: NavBarStyle.style6, navBarStyle: NavBarStyle.style6,
backgroundColor: Theme.of(context).colorScheme.onSecondary,
decoration: const NavBarDecoration( decoration: const NavBarDecoration(
border: Border.symmetric(vertical: BorderSide.none, horizontal: BorderSide(color: Colors.grey, width: 1)) border: Border.symmetric(vertical: BorderSide.none, horizontal: BorderSide(color: Colors.grey, width: 1))
), ),
@ -57,13 +58,13 @@ class _AppState extends State<App> {
items: [ items: [
PersistentBottomNavBarItem( PersistentBottomNavBarItem(
activeColorPrimary: Theme.of(context).primaryColor, activeColorPrimary: Theme.of(context).primaryColor,
inactiveColorPrimary: Theme.of(context).disabledColor, inactiveColorPrimary: Theme.of(context).colorScheme.secondary,
icon: const Icon(Icons.calendar_month), icon: const Icon(Icons.calendar_month),
title: "Vertretung" title: "Vertretung"
), ),
PersistentBottomNavBarItem( PersistentBottomNavBarItem(
activeColorPrimary: Theme.of(context).primaryColor, activeColorPrimary: Theme.of(context).primaryColor,
inactiveColorPrimary: Theme.of(context).disabledColor, inactiveColorPrimary: Theme.of(context).colorScheme.secondary,
icon: Consumer<ChatListProps>( icon: Consumer<ChatListProps>(
builder: (context, value, child) { builder: (context, value, child) {
if(value.primaryLoading()) return const Icon(Icons.chat); if(value.primaryLoading()) return const Icon(Icons.chat);
@ -86,13 +87,13 @@ class _AppState extends State<App> {
), ),
PersistentBottomNavBarItem( PersistentBottomNavBarItem(
activeColorPrimary: Theme.of(context).primaryColor, activeColorPrimary: Theme.of(context).primaryColor,
inactiveColorPrimary: Theme.of(context).disabledColor, inactiveColorPrimary: Theme.of(context).colorScheme.secondary,
icon: const Icon(Icons.folder), icon: const Icon(Icons.folder),
title: "Dateien" title: "Dateien"
), ),
PersistentBottomNavBarItem( PersistentBottomNavBarItem(
activeColorPrimary: Theme.of(context).primaryColor, activeColorPrimary: Theme.of(context).primaryColor,
inactiveColorPrimary: Theme.of(context).disabledColor, inactiveColorPrimary: Theme.of(context).colorScheme.secondary,
icon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz),
title: "Mehr" title: "Mehr"
), ),

36
lib/data/appTheme.dart Normal file
View File

@ -0,0 +1,36 @@
import 'package:flutter/material.dart';
class AppTheme extends ChangeNotifier {
ThemeMode _mode = ThemeMode.system;
ThemeMode get getMode => _mode;
void setTheme(ThemeMode newMode) {
_mode = newMode;
notifyListeners();
}
static ThemeModeDisplay getDisplayOptions(ThemeMode theme) {
switch(theme) {
case ThemeMode.system:
return ThemeModeDisplay(icon: Icons.auto_awesome, displayName: "Systemvorgabe");
case ThemeMode.light:
return ThemeModeDisplay(icon: Icons.dark_mode_outlined, displayName: "Hell");
case ThemeMode.dark:
return ThemeModeDisplay(icon: Icons.dark_mode, displayName: "Dunkel");
}
}
static bool isDarkMode(BuildContext context) {
return Theme.of(context).brightness == Brightness.dark;
}
}
class ThemeModeDisplay {
final IconData icon;
final String displayName;
ThemeModeDisplay({required this.icon, required this.displayName});
}

View File

@ -3,8 +3,11 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/data/appTheme.dart';
import 'package:marianum_mobile/data/timetable/timetableProps.dart'; import 'package:marianum_mobile/data/timetable/timetableProps.dart';
import 'package:marianum_mobile/screen/login/login.dart'; import 'package:marianum_mobile/screen/login/login.dart';
import 'package:marianum_mobile/theming/darkAppTheme.dart';
import 'package:marianum_mobile/theming/lightAppTheme.dart';
import 'package:marianum_mobile/widget/errorView.dart'; import 'package:marianum_mobile/widget/errorView.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
@ -30,6 +33,7 @@ Future<void> main() async {
MultiProvider( MultiProvider(
providers: [ providers: [
ChangeNotifierProvider(create: (context) => AccountModel()), ChangeNotifierProvider(create: (context) => AccountModel()),
ChangeNotifierProvider(create: (context) => AppTheme()),
ChangeNotifierProvider(create: (context) => TimetableProps()), ChangeNotifierProvider(create: (context) => TimetableProps()),
ChangeNotifierProvider(create: (context) => ChatListProps()), ChangeNotifierProvider(create: (context) => ChatListProps()),
ChangeNotifierProvider(create: (context) => ChatProps()), ChangeNotifierProvider(create: (context) => ChatProps()),
@ -48,7 +52,6 @@ class Main extends StatefulWidget {
} }
class _MainState extends State<Main> { class _MainState extends State<Main> {
static const Color marianumRed = Color.fromARGB(255, 153, 51, 51);
final Future<SharedPreferences> _storage = SharedPreferences.getInstance(); final Future<SharedPreferences> _storage = SharedPreferences.getInstance();
@ -70,63 +73,48 @@ class _MainState extends State<Main> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return MaterialApp( return Directionality(
debugShowCheckedModeBanner: false, textDirection: TextDirection.ltr,
localizationsDelegates: const [ child: Consumer<AppTheme>(
...GlobalMaterialLocalizations.delegates, builder: (context, value, child) {
GlobalWidgetsLocalizations.delegate, return MaterialApp(
], debugShowCheckedModeBanner: false,
supportedLocales: const [ localizationsDelegates: const [
Locale('de'), ...GlobalMaterialLocalizations.delegates,
Locale('en'), GlobalWidgetsLocalizations.delegate,
], ],
locale: const Locale('de'), supportedLocales: const [
Locale('de'),
Locale('en'),
],
locale: const Locale('de'),
title: 'Marianum Fulda', title: 'Marianum Fulda',
theme: ThemeData(
brightness: Brightness.light,
primaryColor: marianumRed,
colorScheme: const ColorScheme(
brightness: Brightness.light,
surface: Colors.white,
onSurface: Colors.black,
onSecondary: Colors.white,
onPrimary: Colors.white,
onError: marianumRed,
onBackground: Colors.black,
error: marianumRed,
background: Colors.white,
secondary: marianumRed,
primary: marianumRed,
),
hintColor: marianumRed,
inputDecorationTheme: const InputDecorationTheme(
border: UnderlineInputBorder(borderSide: BorderSide(color: marianumRed)),
),
appBarTheme: const AppBarTheme(
backgroundColor: marianumRed,
),
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: marianumRed,
),
),
home: FutureBuilder<SharedPreferences>( themeMode: value.getMode,
future: _storage, theme: LightAppTheme.theme,
builder: (BuildContext context, AsyncSnapshot<SharedPreferences> snapshot) { darkTheme: DarkAppTheme.theme,
if(snapshot.hasData) {
return Consumer<AccountModel>( home: FutureBuilder<SharedPreferences>(
builder: (context, accountModel, child) { future: _storage,
return accountModel.isLoggedIn ? const App() : const Login(); builder: (BuildContext context, AsyncSnapshot<SharedPreferences> snapshot) {
},
); if(snapshot.hasData) {
} else { return Consumer<AccountModel>(
return const Center(child: CircularProgressIndicator()); builder: (context, accountModel, child) {
} return accountModel.isLoggedIn ? const App() : const Login();
},
);
} else {
return const Center(child: CircularProgressIndicator());
}
},
)
);
}, },
) ),
); );
} }
} }

View File

@ -0,0 +1,128 @@
import 'package:flutter/material.dart';
class ColorPreviewWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
final themeData = Theme.of(context);
return ListView(
children: <Widget>[
ListTile(
leading: Icon(Icons.color_lens_outlined),
title: Text('Farbtest'),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ColorPreviewPage(),
),
);
},
),
],
);
}
}
class ColorPreviewPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final themeData = Theme.of(context);
final colorScheme = themeData.colorScheme;
return Scaffold(
appBar: AppBar(
title: Text('Farbtest'),
),
body: ListView(
children: <Widget>[
for (var entry in [
'Primary',
'Primary Variant',
'Secondary',
'Secondary Variant',
'Background',
'Surface',
'Error',
'On Primary',
'On Secondary',
'On Background',
'On Surface',
'On Error',
])
ColorItem(name: entry, color: _getColor(colorScheme, entry)),
],
),
);
}
Color _getColor(ColorScheme colorScheme, String name) {
switch (name) {
case 'Primary':
return colorScheme.primary;
case 'Primary Variant':
return colorScheme.primaryVariant;
case 'Secondary':
return colorScheme.secondary;
case 'Secondary Variant':
return colorScheme.secondaryVariant;
case 'Background':
return colorScheme.background;
case 'Surface':
return colorScheme.surface;
case 'Error':
return colorScheme.error;
case 'On Primary':
return colorScheme.onPrimary;
case 'On Secondary':
return colorScheme.onSecondary;
case 'On Background':
return colorScheme.onBackground;
case 'On Surface':
return colorScheme.onSurface;
case 'On Error':
return colorScheme.onError;
default:
return Colors.transparent;
}
}
}
class ColorItem extends StatelessWidget {
final String name;
final Color color;
const ColorItem({Key? key, required this.name, required this.color})
: super(key: key);
@override
Widget build(BuildContext context) {
final themeData = Theme.of(context);
return Container(
padding: EdgeInsets.all(16.0),
color: color,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Text(
name,
style: TextStyle(
color: themeData.brightness == Brightness.light
? Colors.black
: Colors.white,
),
),
Text(
'#${color.value.toRadixString(16).padLeft(8, '0').toUpperCase()}',
style: TextStyle(
color: themeData.brightness == Brightness.light
? Colors.black
: Colors.white,
),
),
],
),
);
}
}

View File

@ -5,6 +5,7 @@ import 'package:marianum_mobile/screen/settings/settings.dart';
import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart'; import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
import '../../../widget/ListItem.dart'; import '../../../widget/ListItem.dart';
import 'debug/ThemeColors.dart';
import 'message/message.dart'; import 'message/message.dart';
class Overhang extends StatelessWidget { class Overhang extends StatelessWidget {
@ -20,11 +21,12 @@ class Overhang extends StatelessWidget {
], ],
), ),
body: ListView( body: ListView(
children: const [ children: [
ListItemNavigator(icon: Icons.newspaper, text: "Marianum Message", target: Message()), ListItemNavigator(icon: Icons.newspaper, text: "Marianum Message", target: Message()),
ListItemNavigator(icon: Icons.room, text: "Raumplan", target: Roomplan()), ListItemNavigator(icon: Icons.room, text: "Raumplan", target: Roomplan()),
ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Roomplan()), ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Roomplan()),
ListItemNavigator(icon: Icons.calculate, text: "Notendurschnitts rechner", target: Roomplan()) ListItemNavigator(icon: Icons.calculate, text: "Notendurschnitts rechner", target: Roomplan()),
ListItemNavigator(icon: Icons.color_lens_outlined, text: "Farbtest", target: ColorPreviewPage())
], ],
), ),
); );

View File

@ -5,6 +5,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:jiffy/jiffy.dart'; import 'package:jiffy/jiffy.dart';
import 'package:marianum_mobile/data/appTheme.dart';
import '../../../api/marianumcloud/talk/chat/getChatResponse.dart'; import '../../../api/marianumcloud/talk/chat/getChatResponse.dart';
import '../../../api/marianumcloud/talk/room/getRoomResponse.dart'; import '../../../api/marianumcloud/talk/room/getRoomResponse.dart';
@ -30,18 +31,26 @@ class ChatBubble extends StatefulWidget {
} }
class _ChatBubbleState extends State<ChatBubble> { class _ChatBubbleState extends State<ChatBubble> {
static const styleSystem = BubbleStyle( // late BubbleStyle styleSystem;
color: Color(0xffd4eaf4), // late BubbleStyle Function(bool) styleRemote;
borderWidth: 1, // late BubbleStyle Function(bool) styleSelf;
elevation: 2,
margin: BubbleEdges.only(bottom: 20, top: 10),
alignment: Alignment.center,
);
static BubbleStyle getStyleOther(bool seamless) {
BubbleStyle getSystemStyle() {
return BubbleStyle(
color: AppTheme.isDarkMode(context) ? Color(0xff182229) : Colors.white,
borderWidth: 1,
elevation: 2,
margin: const BubbleEdges.only(bottom: 20, top: 10),
alignment: Alignment.center,
);
}
BubbleStyle getRemoteStyle(bool seamless) {
var color = AppTheme.isDarkMode(context) ? Color(0xff202c33) : Colors.white;
return BubbleStyle( return BubbleStyle(
nip: BubbleNip.leftTop, nip: BubbleNip.leftTop,
color: seamless ? Colors.transparent : Colors.white, color: seamless ? Colors.transparent : color,
borderWidth: seamless ? 0 : 1, borderWidth: seamless ? 0 : 1,
elevation: seamless ? 0 : 1, elevation: seamless ? 0 : 1,
margin: const BubbleEdges.only(bottom: 10, left: 10, right: 50), margin: const BubbleEdges.only(bottom: 10, left: 10, right: 50),
@ -49,10 +58,10 @@ class _ChatBubbleState extends State<ChatBubble> {
); );
} }
static BubbleStyle getStyleSelf(bool seamless) { BubbleStyle getSelfStyle(bool seamless) {
return BubbleStyle( return BubbleStyle(
nip: BubbleNip.rightBottom, nip: BubbleNip.rightBottom,
color: seamless ? Colors.transparent : const Color(0xffd9fdd3), color: seamless ? Colors.transparent : Color(0xff005c4b),
borderWidth: seamless ? 0 : 1, borderWidth: seamless ? 0 : 1,
elevation: seamless ? 0 : 1, elevation: seamless ? 0 : 1,
margin: const BubbleEdges.only(bottom: 10, right: 10, left: 50), margin: const BubbleEdges.only(bottom: 10, right: 10, left: 50),
@ -76,12 +85,12 @@ class _ChatBubbleState extends State<ChatBubble> {
BubbleStyle getStyle() { BubbleStyle getStyle() {
if(widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment) { if(widget.bubbleData.messageType == GetRoomResponseObjectMessageType.comment) {
if(widget.isSender) { if(widget.isSender) {
return getStyleSelf(message.containsFile); return getSelfStyle(message.containsFile);
} else { } else {
return getStyleOther(message.containsFile); return getRemoteStyle(message.containsFile);
} }
} else { } else {
return styleSystem; return getSystemStyle();
} }
} }

View File

@ -56,7 +56,7 @@ class _ChatTextfieldState extends State<ChatTextfield> {
padding: const EdgeInsets.only(left: 10, bottom: 10, top: 10), padding: const EdgeInsets.only(left: 10, bottom: 10, top: 10),
height: 60, height: 60,
width: double.infinity, width: double.infinity,
color: Colors.white, color: Theme.of(context).colorScheme.secondary,
child: Row( child: Row(
children: <Widget>[ children: <Widget>[
GestureDetector( GestureDetector(
@ -108,9 +108,9 @@ class _ChatTextfieldState extends State<ChatTextfield> {
controller: _textBoxController, controller: _textBoxController,
readOnly: sending, readOnly: sending,
maxLines: 10, maxLines: 10,
decoration: const InputDecoration( decoration: InputDecoration(
hintText: "Nachricht schreiben...", hintText: "Nachricht schreiben...",
hintStyle: TextStyle(color: Colors.black54), hintStyle: TextStyle(color: Theme.of(context).colorScheme.onSecondary),
border: InputBorder.none border: InputBorder.none
), ),
), ),

View File

@ -4,6 +4,7 @@ import 'package:jiffy/jiffy.dart';
import 'package:loader_overlay/loader_overlay.dart'; import 'package:loader_overlay/loader_overlay.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatResponse.dart'; import 'package:marianum_mobile/api/marianumcloud/talk/chat/getChatResponse.dart';
import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart'; import 'package:marianum_mobile/api/marianumcloud/talk/room/getRoomResponse.dart';
import 'package:marianum_mobile/data/appTheme.dart';
import 'package:marianum_mobile/data/chatList/chatProps.dart'; import 'package:marianum_mobile/data/chatList/chatProps.dart';
import 'package:marianum_mobile/screen/pages/talk/chatBubble.dart'; import 'package:marianum_mobile/screen/pages/talk/chatBubble.dart';
import 'package:marianum_mobile/screen/pages/talk/chatTextfield.dart'; import 'package:marianum_mobile/screen/pages/talk/chatTextfield.dart';
@ -84,13 +85,13 @@ class _ChatViewState extends State<ChatView> {
), ),
), ),
body: Container( body: Container(
decoration: const BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: AssetImage("assets/background/chat.png"), image: AppTheme.isDarkMode(context) ? const AssetImage("assets/background/chatDark.png") : const AssetImage("assets/background/chat.png"),
scale: 1.5, scale: 1.5,
opacity: 0.5, opacity: 0.5,
repeat: ImageRepeat.repeat, repeat: ImageRepeat.repeat,
colorFilter: ColorFilter.linearToSrgbGamma() colorFilter: const ColorFilter.linearToSrgbGamma()
) )
), ),
child: LoaderOverlay( child: LoaderOverlay(

View File

@ -6,6 +6,7 @@ import 'package:shared_preferences/shared_preferences.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import '../../data/accountModel.dart'; import '../../data/accountModel.dart';
import '../../data/appTheme.dart';
import 'debug/debugOverview.dart'; import 'debug/debugOverview.dart';
class Settings extends StatefulWidget { class Settings extends StatefulWidget {
@ -72,6 +73,35 @@ class _SettingsState extends State<Settings> {
const Divider(), const Divider(),
Consumer<AppTheme>(
builder: (context, value, child) {
return ListTile(
leading: const Icon(Icons.dark_mode),
title: const Text("Farbgebung"),
trailing: DropdownButton<ThemeMode>(
value: value.getMode,
icon: const Icon(Icons.arrow_drop_down),
items: ThemeMode.values.map((e) => DropdownMenuItem<ThemeMode>(
value: e,
enabled: e != value.getMode,
child: Row(
children: [
Icon(AppTheme.getDisplayOptions(e).icon),
const SizedBox(width: 10),
Text(AppTheme.getDisplayOptions(e).displayName),
],
),
)).toList(),
onChanged: (e) {
Provider.of<AppTheme>(context, listen: false).setTheme(e ?? ThemeMode.system);
},
),
);
},
),
const Divider(),
ListTile( ListTile(
leading: const Icon(Icons.info), leading: const Icon(Icons.info),
title: const Text("Informationen und Lizenzen"), title: const Text("Informationen und Lizenzen"),

View File

@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
class DarkAppTheme {
static const Color marianumRed = Color.fromARGB(255, 153, 51, 51);
static final theme = ThemeData(
brightness: Brightness.dark,
primaryColor: marianumRed,
hintColor: marianumRed,
colorScheme: const ColorScheme(
brightness: Brightness.dark,
surface: Colors.black,
onSurface: Colors.white,
primary: Colors.black,
onPrimary: Colors.white,
secondary: Colors.grey,
onSecondary: Colors.white,
background: Colors.black26,
onBackground: Colors.white,
error: marianumRed,
onError: marianumRed,
),
inputDecorationTheme: const InputDecorationTheme(
border: UnderlineInputBorder(borderSide: BorderSide(color: marianumRed)),
),
appBarTheme: const AppBarTheme(
backgroundColor: marianumRed,
),
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: marianumRed,
),
);
}

View File

@ -0,0 +1,39 @@
import 'package:flutter/material.dart';
class LightAppTheme {
static const Color marianumRed = Color.fromARGB(255, 153, 51, 51);
static final theme = ThemeData(
brightness: Brightness.light,
primaryColor: marianumRed,
colorScheme: const ColorScheme(
brightness: Brightness.light,
surface: Colors.white,
onSurface: Colors.black,
secondary: Colors.grey,
onSecondary: Colors.white,
primary: marianumRed,
onPrimary: Colors.white,
background: Colors.white,
onBackground: Colors.black,
error: marianumRed,
onError: marianumRed,
),
inputDecorationTheme: const InputDecorationTheme(
border: UnderlineInputBorder(borderSide: BorderSide(color: marianumRed)),
),
appBarTheme: const AppBarTheme(
backgroundColor: marianumRed,
),
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: marianumRed,
),
);
}