250 lines
8.5 KiB
Dart
250 lines
8.5 KiB
Dart
import "dart:async";
|
|
|
|
import "package:moxxyv2/ui/events.dart";
|
|
import "package:moxxyv2/ui/constants.dart";
|
|
/*
|
|
import "package:moxxyv2/ui/pages/register/register.dart";
|
|
import "package:moxxyv2/ui/pages/postregister/postregister.dart";
|
|
import "package:moxxyv2/ui/pages/sendfiles.dart";
|
|
*/
|
|
import "package:moxxyv2/ui/pages/addcontact.dart";
|
|
import "package:moxxyv2/ui/pages/blocklist.dart";
|
|
import "package:moxxyv2/ui/pages/conversation.dart";
|
|
import "package:moxxyv2/ui/pages/newconversation.dart";
|
|
import "package:moxxyv2/ui/pages/conversations.dart";
|
|
import "package:moxxyv2/ui/pages/login.dart";
|
|
import "package:moxxyv2/ui/pages/intro.dart";
|
|
import "package:moxxyv2/ui/pages/sharedmedia.dart";
|
|
import "package:moxxyv2/ui/pages/crop.dart";
|
|
import "package:moxxyv2/ui/pages/splashscreen/splashscreen.dart";
|
|
import "package:moxxyv2/ui/pages/settings/debugging.dart";
|
|
import "package:moxxyv2/ui/pages/settings/privacy.dart";
|
|
import "package:moxxyv2/ui/pages/settings/network.dart";
|
|
import "package:moxxyv2/ui/pages/settings/appearance.dart";
|
|
import "package:moxxyv2/ui/pages/profile/profile.dart";
|
|
import "package:moxxyv2/ui/pages/settings/settings.dart";
|
|
import "package:moxxyv2/ui/pages/settings/licenses.dart";
|
|
import "package:moxxyv2/ui/pages/settings/about.dart";
|
|
import "package:moxxyv2/ui/bloc/navigation_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/login_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/conversations_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/newconversation_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/conversation_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/blocklist_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/profile_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/preferences_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/addcontact_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/sharedmedia_bloc.dart";
|
|
import "package:moxxyv2/ui/bloc/crop_bloc.dart";
|
|
import "package:moxxyv2/ui/service/download.dart";
|
|
import "package:moxxyv2/ui/service/data.dart";
|
|
import "package:moxxyv2/ui/service/thumbnail.dart";
|
|
import "package:moxxyv2/service/service.dart";
|
|
import "package:moxxyv2/shared/commands.dart";
|
|
|
|
import "package:flutter/material.dart";
|
|
import "package:flutter_bloc/flutter_bloc.dart";
|
|
import "package:page_transition/page_transition.dart";
|
|
import "package:get_it/get_it.dart";
|
|
import "package:logging/logging.dart";
|
|
import "package:moxplatform/moxplatform.dart";
|
|
|
|
void setupLogging() {
|
|
Logger.root.level = Level.ALL;
|
|
Logger.root.onRecord.listen((record) {
|
|
// ignore: avoid_print
|
|
print("[${record.level.name}] (${record.loggerName}) ${record.time}: ${record.message}");
|
|
});
|
|
GetIt.I.registerSingleton<Logger>(Logger("MoxxyMain"));
|
|
}
|
|
|
|
Future<void> setupUIServices() async {
|
|
GetIt.I.registerSingleton<UIDownloadService>(UIDownloadService());
|
|
GetIt.I.registerSingleton<UIDataService>(UIDataService());
|
|
GetIt.I.registerSingleton<ThumbnailCacheService>(ThumbnailCacheService());
|
|
await GetIt.I.get<UIDataService>().init();
|
|
}
|
|
|
|
void setupBlocs(GlobalKey<NavigatorState> navKey) {
|
|
GetIt.I.registerSingleton<NavigationBloc>(NavigationBloc(navigationKey: navKey));
|
|
GetIt.I.registerSingleton<ConversationsBloc>(ConversationsBloc());
|
|
GetIt.I.registerSingleton<NewConversationBloc>(NewConversationBloc());
|
|
GetIt.I.registerSingleton<ConversationBloc>(ConversationBloc());
|
|
GetIt.I.registerSingleton<BlocklistBloc>(BlocklistBloc());
|
|
GetIt.I.registerSingleton<ProfileBloc>(ProfileBloc());
|
|
GetIt.I.registerSingleton<PreferencesBloc>(PreferencesBloc());
|
|
GetIt.I.registerSingleton<AddContactBloc>(AddContactBloc());
|
|
GetIt.I.registerSingleton<SharedMediaBloc>(SharedMediaBloc());
|
|
GetIt.I.registerSingleton<CropBloc>(CropBloc());
|
|
}
|
|
|
|
// TODO: Replace all Column(children: [ Padding(), Padding, ...]) with a
|
|
// Padding(padding: ..., child: Column(children: [ ... ]))
|
|
// TODO: Theme the switches
|
|
void main() async {
|
|
GetIt.I.registerSingleton<Completer>(Completer());
|
|
|
|
setupLogging();
|
|
await setupUIServices();
|
|
|
|
setupEventHandler();
|
|
|
|
final navKey = GlobalKey<NavigatorState>();
|
|
setupBlocs(navKey);
|
|
|
|
await initializeServiceIfNeeded();
|
|
|
|
runApp(
|
|
MultiBlocProvider(
|
|
providers: [
|
|
BlocProvider<NavigationBloc>(
|
|
create: (_) => GetIt.I.get<NavigationBloc>()
|
|
),
|
|
BlocProvider<LoginBloc>(
|
|
create: (_) => LoginBloc()
|
|
),
|
|
BlocProvider<ConversationsBloc>(
|
|
create: (_) => GetIt.I.get<ConversationsBloc>()
|
|
),
|
|
BlocProvider<NewConversationBloc>(
|
|
create: (_) => GetIt.I.get<NewConversationBloc>()
|
|
),
|
|
BlocProvider<ConversationBloc>(
|
|
create: (_) => GetIt.I.get<ConversationBloc>()
|
|
),
|
|
BlocProvider<BlocklistBloc>(
|
|
create: (_) => GetIt.I.get<BlocklistBloc>()
|
|
),
|
|
BlocProvider<ProfileBloc>(
|
|
create: (_) => GetIt.I.get<ProfileBloc>()
|
|
),
|
|
BlocProvider<PreferencesBloc>(
|
|
create: (_) => GetIt.I.get<PreferencesBloc>()
|
|
),
|
|
BlocProvider<AddContactBloc>(
|
|
create: (_) => GetIt.I.get<AddContactBloc>()
|
|
),
|
|
BlocProvider<SharedMediaBloc>(
|
|
create: (_) => GetIt.I.get<SharedMediaBloc>()
|
|
),
|
|
BlocProvider<CropBloc>(
|
|
create: (_) => GetIt.I.get<CropBloc>()
|
|
)
|
|
],
|
|
child: MyApp(navKey)
|
|
)
|
|
);
|
|
}
|
|
|
|
class MyApp extends StatefulWidget {
|
|
final GlobalKey<NavigatorState> navigationKey;
|
|
|
|
const MyApp(this.navigationKey, { Key? key }) : super(key: key);
|
|
|
|
@override
|
|
_MyAppState createState() => _MyAppState();
|
|
}
|
|
|
|
class _MyAppState extends State<MyApp> with WidgetsBindingObserver {
|
|
_MyAppState();
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
WidgetsBinding.instance.addObserver(this);
|
|
|
|
// Lift the UI block
|
|
GetIt.I.get<Completer>().complete();
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
|
super.didChangeAppLifecycleState(state);
|
|
|
|
final sender = MoxplatformPlugin.handler.getDataSender();
|
|
switch (state) {
|
|
case AppLifecycleState.paused: {
|
|
sender.sendData(
|
|
SetCSIStateCommand(active: false)
|
|
);
|
|
GetIt.I.get<ConversationBloc>().add(AppStateChanged(false));
|
|
}
|
|
break;
|
|
case AppLifecycleState.resumed: {
|
|
sender.sendData(
|
|
SetCSIStateCommand(active: true)
|
|
);
|
|
GetIt.I.get<ConversationBloc>().add(AppStateChanged(true));
|
|
}
|
|
break;
|
|
default: break;
|
|
}
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return MaterialApp(
|
|
title: "Moxxy",
|
|
theme: ThemeData(
|
|
primarySwatch: Colors.blue,
|
|
),
|
|
darkTheme: ThemeData(
|
|
brightness: Brightness.dark,
|
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
|
style: ElevatedButton.styleFrom(
|
|
primary: primaryColor,
|
|
onPrimary: Colors.white
|
|
)
|
|
),
|
|
textButtonTheme: TextButtonThemeData(
|
|
style: TextButton.styleFrom(
|
|
primary: primaryColor
|
|
)
|
|
),
|
|
// NOTE: Mainly for the SettingsSection
|
|
colorScheme: const ColorScheme.dark(
|
|
secondary: primaryColor
|
|
),
|
|
|
|
backgroundColor: const Color(0xff303030)
|
|
),
|
|
navigatorKey: widget.navigationKey,
|
|
themeMode: ThemeMode.system,
|
|
onGenerateRoute: (settings) {
|
|
switch (settings.name) {
|
|
case introRoute: return Intro.route;
|
|
case loginRoute: return Login.route;
|
|
case conversationsRoute: return ConversationsPage.route;
|
|
case newConversationRoute: return NewConversationPage.route;
|
|
case conversationRoute: return PageTransition(
|
|
child: const ConversationPage(),
|
|
type: PageTransitionType.rightToLeft,
|
|
settings: settings
|
|
);
|
|
case sharedMediaRoute: return SharedMediaPage.route;
|
|
case blocklistRoute: return BlocklistPage.route;
|
|
case profileRoute: return ProfilePage.route;
|
|
case settingsRoute: return SettingsPage.route;
|
|
case aboutRoute: return SettingsAboutPage.route;
|
|
case licensesRoute: return SettingsLicensesPage.route;
|
|
case appearanceRoute: return AppearancePage.route;
|
|
case networkRoute: return NetworkPage.route;
|
|
case privacyRoute: return PrivacyPage.route;
|
|
case debuggingRoute: return DebuggingPage.route;
|
|
case addContactRoute: return AddContactPage.route;
|
|
case cropRoute: return CropPage.route;
|
|
}
|
|
|
|
return null;
|
|
},
|
|
home: const Splashscreen()
|
|
);
|
|
}
|
|
}
|