Files
localsend/lib/init.dart
2023-01-26 02:01:50 +01:00

103 lines
3.6 KiB
Dart

import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:localsend_app/gen/strings.g.dart';
import 'package:localsend_app/pages/home_page.dart';
import 'package:localsend_app/provider/network/server_provider.dart';
import 'package:localsend_app/provider/persistence_provider.dart';
import 'package:localsend_app/provider/selection/selected_sending_files_provider.dart';
import 'package:localsend_app/provider/settings_provider.dart';
import 'package:localsend_app/theme.dart';
import 'package:localsend_app/util/cache_helper.dart';
import 'package:localsend_app/util/platform_check.dart';
import 'package:localsend_app/util/snackbar.dart';
import 'package:localsend_app/util/tray_helper.dart';
import 'package:routerino/routerino.dart';
import 'package:share_handler/share_handler.dart';
import 'package:window_manager/window_manager.dart';
const launchAtStartupArg = 'autostart';
/// Will be called before the MaterialApp started
Future<PersistenceService> preInit(List<String> args) async {
WidgetsFlutterBinding.ensureInitialized();
if (checkPlatformIsDesktop()) {
await windowManager.ensureInitialized();
WindowManager.instance.setMinimumSize(const Size(400, 500));
// use the "slide" transition for desktop
Routerino.transition = RouterinoTransition.cupertino;
}
if (checkPlatformWithGallery()) {
clearCache();
}
final persistenceService = await PersistenceService.initialize();
final locale = persistenceService.getLocale();
if (locale == null) {
LocaleSettings.useDeviceLocale();
} else {
LocaleSettings.setLocale(locale);
}
if (checkPlatformIsDesktop()) {
// initialize tray AFTER i18n has been initialized
await initTray();
if (!args.contains(launchAtStartupArg) || !persistenceService.isAutoStartLaunchMinimized()) {
// We show this app, when (1) app started manually, (2) app should not start minimized
// In other words: only start minimized when launched on startup and "launchMinimized" is configured
await windowManager.show();
}
}
return persistenceService;
}
StreamSubscription? _sharedMediaSubscription;
/// Will be called when home page has been initialized
Future<void> postInit(BuildContext context, WidgetRef ref, void Function(int) goToPage) async {
updateSystemOverlayStyle(context);
final settings = ref.read(settingsProvider);
try {
await ref.read(serverProvider.notifier).startServer(
alias: settings.alias,
port: settings.port,
);
} catch (e) {
context.showSnackBar(e.toString());
}
if (checkPlatformCanReceiveShareIntent()) {
final shareHandler = ShareHandlerPlatform.instance;
final initialSharedPayload = await shareHandler.getInitialSharedMedia();
if (initialSharedPayload != null) {
_handleSharedIntent(initialSharedPayload, ref);
goToPage(HomeTab.send.index);
}
_sharedMediaSubscription?.cancel();
_sharedMediaSubscription = shareHandler.sharedMediaStream.listen((SharedMedia payload) {
_handleSharedIntent(payload, ref);
goToPage(HomeTab.send.index);
});
}
}
void _handleSharedIntent(SharedMedia payload, WidgetRef ref) {
final message = payload.content;
if (message != null && message.trim().isNotEmpty) {
ref.read(selectedSendingFilesProvider.notifier).addMessage(message);
}
ref.read(selectedSendingFilesProvider.notifier).addFiles(
files: payload.attachments?.where((a) => a != null).cast<SharedAttachment>() ?? <SharedAttachment>[],
converter: CrossFileConverters.convertSharedAttachment,
);
}