flutter_app/lib/main.dart

167 lines
6.5 KiB
Dart
Raw Permalink Normal View History

import 'dart:convert';
2021-05-25 20:43:13 +00:00
import 'package:cwtch/notification_manager.dart';
import 'package:cwtch/views/messageview.dart';
import 'package:cwtch/widgets/rightshiftfixer.dart';
2021-03-16 19:54:48 +00:00
import 'package:flutter/foundation.dart';
2021-05-19 21:39:52 +00:00
import 'package:cwtch/cwtch/ffi.dart';
import 'package:cwtch/cwtch/gomobile.dart';
import 'package:flutter/material.dart';
2021-05-19 21:39:52 +00:00
import 'package:cwtch/errorHandler.dart';
import 'package:cwtch/settings.dart';
import 'package:cwtch/torstatus.dart';
import 'package:cwtch/views/triplecolview.dart';
import 'package:flutter/services.dart';
import 'package:provider/provider.dart';
import 'cwtch/cwtch.dart';
import 'cwtch/cwtchNotifier.dart';
2021-03-16 19:54:48 +00:00
import 'licenses.dart';
import 'model.dart';
import 'views/profilemgrview.dart';
import 'views/splashView.dart';
2021-06-16 21:25:08 +00:00
import 'dart:io' show Platform, exit;
2021-01-21 20:37:35 +00:00
import 'opaque.dart';
2021-02-23 02:55:10 +00:00
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
2021-02-25 23:33:15 +00:00
var globalSettings = Settings(Locale("en", ''), OpaqueDark());
2021-03-24 23:35:24 +00:00
var globalErrorHandler = ErrorHandler();
2021-04-13 22:29:23 +00:00
var globalTorStatus = TorStatus();
var globalAppState = AppState();
2021-03-10 17:40:14 +00:00
2021-03-16 19:54:48 +00:00
void main() {
print("main()");
2021-03-16 19:54:48 +00:00
LicenseRegistry.addLicense(() => licenses());
2021-06-22 00:56:34 +00:00
WidgetsFlutterBinding.ensureInitialized();
print("runApp()");
2021-03-16 19:54:48 +00:00
runApp(Flwtch());
}
class Flwtch extends StatefulWidget {
final Key flwtch = GlobalKey();
@override
FlwtchState createState() => FlwtchState();
}
class FlwtchState extends State<Flwtch> {
final TextStyle biggerFont = const TextStyle(fontSize: 18);
2021-05-25 00:11:39 +00:00
late Cwtch cwtch;
late ProfileListState profs;
final MethodChannel notificationClickChannel = MethodChannel('im.cwtch.flwtch/notificationClickHandler');
final MethodChannel shutdownMethodChannel = MethodChannel('im.cwtch.flwtch/shutdown');
final GlobalKey<NavigatorState> navKey = GlobalKey<NavigatorState>();
@override
initState() {
2021-06-22 00:56:34 +00:00
print("initState: running...");
super.initState();
2021-06-22 00:56:34 +00:00
print("initState: registering notification, shutdown handlers...");
profs = ProfileListState();
notificationClickChannel.setMethodCallHandler(_externalNotificationClicked);
shutdownMethodChannel.setMethodCallHandler(shutdown);
2021-06-22 00:56:34 +00:00
print("initState: creating cwtchnotifier, ffi");
if (Platform.isAndroid) {
var cwtchNotifier = new CwtchNotifier(profs, globalSettings, globalErrorHandler, globalTorStatus, NullNotificationsManager(), globalAppState);
cwtch = CwtchGomobile(cwtchNotifier);
2021-05-25 20:43:13 +00:00
} else if (Platform.isLinux) {
var cwtchNotifier = new CwtchNotifier(profs, globalSettings, globalErrorHandler, globalTorStatus, LinuxNotificationsManager(), globalAppState);
2021-05-25 20:43:13 +00:00
cwtch = CwtchFfi(cwtchNotifier);
} else {
var cwtchNotifier = new CwtchNotifier(profs, globalSettings, globalErrorHandler, globalTorStatus, NullNotificationsManager(), globalAppState);
cwtch = CwtchFfi(cwtchNotifier);
}
2021-06-22 00:56:34 +00:00
print("initState: invoking cwtch.Start()");
cwtch.Start();
2021-06-22 00:56:34 +00:00
print("initState: done!");
2021-01-27 20:18:28 +00:00
}
2021-04-13 22:29:23 +00:00
ChangeNotifierProvider<TorStatus> getTorStatusProvider() => ChangeNotifierProvider.value(value: globalTorStatus);
2021-03-24 23:35:24 +00:00
ChangeNotifierProvider<ErrorHandler> getErrorHandlerProvider() => ChangeNotifierProvider.value(value: globalErrorHandler);
2021-03-17 22:54:41 +00:00
ChangeNotifierProvider<Settings> getSettingsProvider() => ChangeNotifierProvider.value(value: globalSettings);
ChangeNotifierProvider<AppState> getAppStateProvider() => ChangeNotifierProvider.value(value: globalAppState);
2021-03-16 23:33:03 +00:00
Provider<FlwtchState> getFlwtchStateProvider() => Provider<FlwtchState>(create: (_) => this);
ChangeNotifierProvider<ProfileListState> getProfileListProvider() => ChangeNotifierProvider(create: (context) => profs);
2021-01-27 20:18:28 +00:00
@override
Widget build(BuildContext context) {
globalSettings.initPackageInfo();
2021-01-27 20:18:28 +00:00
return MultiProvider(
2021-05-25 20:43:13 +00:00
providers: [
getFlwtchStateProvider(),
getProfileListProvider(),
getSettingsProvider(),
getErrorHandlerProvider(),
getTorStatusProvider(),
getAppStateProvider(),
2021-05-25 20:43:13 +00:00
],
builder: (context, widget) {
return Consumer2<Settings, AppState>(
builder: (context, settings, appState, child) => MaterialApp(
2021-04-21 00:24:28 +00:00
key: Key('app'),
navigatorKey: navKey,
locale: settings.locale,
2021-02-23 02:55:10 +00:00
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
title: 'Cwtch',
theme: mkThemeData(settings),
2021-06-24 07:36:41 +00:00
home: appState.cwtchInit == true ? ShiftRightFixer(child: ProfileMgrView()) : SplashView(),
),
);
},
2021-01-27 20:18:28 +00:00
);
}
2021-03-23 22:42:10 +00:00
2021-06-16 21:25:08 +00:00
Future<void> shutdown(MethodCall call) async {
cwtch.Shutdown();
2021-06-16 21:25:08 +00:00
// Wait a few seconds as shutting down things takes a little time..
Future.delayed(Duration(seconds: 2)).then((value) {
if (Platform.isAndroid) {
SystemNavigator.pop();
} else if (Platform.isLinux || Platform.isWindows) {
print("Exiting...");
exit(0);
}
});
}
2021-06-24 07:36:41 +00:00
// Invoked via notificationClickChannel by MyBroadcastReceiver in MainActivity.kt
// coder beware: args["RemotePeer"] is actually a handle, and could be eg a groupID
Future<void> _externalNotificationClicked(MethodCall call) async {
2021-06-14 21:41:05 +00:00
var args = jsonDecode(call.arguments);
var profile = profs.getProfile(args["ProfileOnion"])!;
var contact = profile.contactList.getContact(args["RemotePeer"])!;
contact.unreadMessages = 0;
2021-06-24 07:36:41 +00:00
// single pane mode pushes; double pane mode reads AppState.selectedProfile/Conversation
var isLandscape = Provider.of<AppState>(navKey.currentContext!, listen: false).isLandscape(navKey.currentContext!);
if (Provider.of<Settings>(navKey.currentContext!, listen: false).uiColumns(isLandscape).length == 1) {
if (navKey.currentContext?.findAncestorWidgetOfExactType<MessageView>() != null) {
print("messageview already open; popping before pushing replacement");
navKey.currentState?.pop();
}
navKey.currentState?.push(
MaterialPageRoute<void>(
builder: (BuildContext builderContext) {
return MultiProvider(
providers: [
ChangeNotifierProvider.value(value: profile),
ChangeNotifierProvider.value(value: contact),
],
builder: (context, child) => MessageView(),
);
},
),
);
} else { //dual pane
Provider.of<AppState>(navKey.currentContext!, listen: false).selectedProfile = args["ProfileOnion"];
Provider.of<AppState>(navKey.currentContext!, listen: false).selectedConversation = args["RemotePeer"];
}
}
2021-03-23 22:42:10 +00:00
@override
void dispose() {
cwtch.dispose();
super.dispose();
}
2021-01-27 20:18:28 +00:00
}