style: Lint using very_good_analysis
This commit is contained in:
parent
acd186e0b6
commit
3aad6b617d
@ -4,6 +4,14 @@ Platform-specific code for Moxxy. Not intended for use outside of Moxxy.
|
|||||||
|
|
||||||
This repo is based on [very_good_flutter_plugin](https://github.com/VeryGoodOpenSource/very_good_flutter_plugin).
|
This repo is based on [very_good_flutter_plugin](https://github.com/VeryGoodOpenSource/very_good_flutter_plugin).
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
The development of this package is based on [melos](https://pub.dev/packages/melos).
|
||||||
|
|
||||||
|
To make all packages link to each other locally, begin by running `melos bootstrap`. After editing
|
||||||
|
the code and making your changes, please run `melos run analyze` to make sure that no linter warnings
|
||||||
|
are left inside the code.
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
|
|
||||||
- [ekasetiawans](https://github.com/ekasetiawans) for [flutter_background_service](https://github.com/ekasetiawans/flutter_background_service). moxplatform_android is basically just a copy and paste of [flutter_background_service](https://github.com/ekasetiawans/flutter_background_service).
|
- [ekasetiawans](https://github.com/ekasetiawans) for [flutter_background_service](https://github.com/ekasetiawans/flutter_background_service). moxplatform_android is basically just a copy and paste of [flutter_background_service](https://github.com/ekasetiawans/flutter_background_service).
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
analyzer:
|
include: package:very_good_analysis/analysis_options.yaml
|
||||||
exclude:
|
linter:
|
||||||
- brick/**
|
rules:
|
||||||
|
public_member_api_docs: false
|
||||||
|
lines_longer_than_80_chars: false
|
||||||
|
use_setters_to_change_properties: false
|
||||||
|
avoid_positional_boolean_parameters: false
|
||||||
|
avoid_bool_literals_in_conditional_expressions: false
|
||||||
|
1
packages/moxplatform/analysis_options.yaml
Normal file
1
packages/moxplatform/analysis_options.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
include: ../../analysis_options.yaml
|
@ -1,12 +1,4 @@
|
|||||||
import "package:moxplatform_platform_interface/moxplatform_platform_interface.dart";
|
library moxplatform;
|
||||||
import "package:moxplatform_platform_interface/src/isolate.dart";
|
|
||||||
import "package:moxplatform_platform_interface/src/media.dart";
|
|
||||||
|
|
||||||
export "package:moxplatform_platform_interface/src/isolate.dart" show IsolateHandler;
|
export 'src/plugin.dart';
|
||||||
export "package:moxplatform_platform_interface/src/media.dart" show MediaScannerImplementation;
|
export 'src/types.dart';
|
||||||
export "package:moxplatform_platform_interface/src/service.dart" show BackgroundService;
|
|
||||||
|
|
||||||
class MoxplatformPlugin {
|
|
||||||
static IsolateHandler get handler => MoxplatformInterface.handler;
|
|
||||||
static MediaScannerImplementation get media => MoxplatformInterface.media;
|
|
||||||
}
|
|
||||||
|
6
packages/moxplatform/lib/src/plugin.dart
Normal file
6
packages/moxplatform/lib/src/plugin.dart
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
import 'package:moxplatform_platform_interface/moxplatform_platform_interface.dart';
|
||||||
|
|
||||||
|
class MoxplatformPlugin {
|
||||||
|
static IsolateHandler get handler => MoxplatformInterface.handler;
|
||||||
|
static MediaScannerImplementation get media => MoxplatformInterface.media;
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import "package:moxlib/awaitabledatasender.dart";
|
import 'package:moxlib/awaitabledatasender.dart';
|
||||||
|
|
||||||
abstract class BackgroundCommand implements JsonImplementation {}
|
abstract class BackgroundCommand implements JsonImplementation {}
|
||||||
abstract class BackgroundEvent implements JsonImplementation {}
|
abstract class BackgroundEvent implements JsonImplementation {}
|
@ -19,6 +19,10 @@ dependencies:
|
|||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
|
moxlib:
|
||||||
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
|
version: 0.1.4
|
||||||
|
|
||||||
moxplatform_android:
|
moxplatform_android:
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
version: 0.1.11
|
version: 0.1.11
|
||||||
@ -26,11 +30,8 @@ dependencies:
|
|||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
version: 0.1.11
|
version: 0.1.11
|
||||||
|
|
||||||
moxlib:
|
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
|
||||||
version: 0.1.4
|
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
plugin_platform_interface: 2.1.2
|
plugin_platform_interface: 2.1.2
|
||||||
|
very_good_analysis: 2.4.0
|
||||||
|
1
packages/moxplatform_android/analysis_options.yaml
Normal file
1
packages/moxplatform_android/analysis_options.yaml
Normal file
@ -0,0 +1 @@
|
|||||||
|
include: ../../analysis_options.yaml
|
@ -1,15 +1,6 @@
|
|||||||
import "package:moxplatform_android/isolate_android.dart";
|
library moxplatform_android;
|
||||||
import "package:moxplatform_android/media_android.dart";
|
|
||||||
|
|
||||||
import "package:moxplatform_platform_interface/moxplatform_platform_interface.dart";
|
export 'src/isolate_android.dart';
|
||||||
|
export 'src/media_android.dart';
|
||||||
class MoxplatformAndroidPlugin extends MoxplatformInterface {
|
export 'src/plugin_android.dart';
|
||||||
static void registerWith() {
|
export 'src/service_android.dart';
|
||||||
print("MoxplatformAndroidPlugin: Registering implementation");
|
|
||||||
MoxplatformInterface.handler = AndroidIsolateHandler();
|
|
||||||
MoxplatformInterface.media = AndroidMediaScannerImplementation();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String> getPlatformName() async => "Android";
|
|
||||||
}
|
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
|
|
||||||
import 'moxplatform_android_platform_interface.dart';
|
|
||||||
|
|
||||||
/// An implementation of [MoxplatformAndroidPlatform] that uses method channels.
|
|
||||||
class MethodChannelMoxplatformAndroid extends MoxplatformAndroidPlatform {
|
|
||||||
/// The method channel used to interact with the native platform.
|
|
||||||
@visibleForTesting
|
|
||||||
final methodChannel = const MethodChannel('moxplatform_android');
|
|
||||||
|
|
||||||
@override
|
|
||||||
Future<String?> getPlatformVersion() async {
|
|
||||||
final version = await methodChannel.invokeMethod<String>('getPlatformVersion');
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
|
||||||
|
|
||||||
import 'moxplatform_android_method_channel.dart';
|
|
||||||
|
|
||||||
abstract class MoxplatformAndroidPlatform extends PlatformInterface {
|
|
||||||
/// Constructs a MoxplatformAndroidPlatform.
|
|
||||||
MoxplatformAndroidPlatform() : super(token: _token);
|
|
||||||
|
|
||||||
static final Object _token = Object();
|
|
||||||
|
|
||||||
static MoxplatformAndroidPlatform _instance = MethodChannelMoxplatformAndroid();
|
|
||||||
|
|
||||||
/// The default instance of [MoxplatformAndroidPlatform] to use.
|
|
||||||
///
|
|
||||||
/// Defaults to [MethodChannelMoxplatformAndroid].
|
|
||||||
static MoxplatformAndroidPlatform get instance => _instance;
|
|
||||||
|
|
||||||
/// Platform-specific implementations should set this with their own
|
|
||||||
/// platform-specific class that extends [MoxplatformAndroidPlatform] when
|
|
||||||
/// they register themselves.
|
|
||||||
static set instance(MoxplatformAndroidPlatform instance) {
|
|
||||||
PlatformInterface.verifyToken(instance, _token);
|
|
||||||
_instance = instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
Future<String?> getPlatformVersion() {
|
|
||||||
throw UnimplementedError('platformVersion() has not been implemented.');
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,63 +0,0 @@
|
|||||||
import "dart:convert";
|
|
||||||
import "dart:ui";
|
|
||||||
|
|
||||||
import "package:moxplatform_platform_interface/src/service.dart";
|
|
||||||
import "package:moxplatform/types.dart";
|
|
||||||
import "package:moxlib/awaitabledatasender.dart";
|
|
||||||
import "package:flutter/material.dart";
|
|
||||||
import "package:flutter/services.dart";
|
|
||||||
import "package:logging/logging.dart";
|
|
||||||
import "package:uuid/uuid.dart";
|
|
||||||
import "package:meta/meta.dart";
|
|
||||||
|
|
||||||
class AndroidBackgroundService extends BackgroundService {
|
|
||||||
@internal
|
|
||||||
static const MethodChannel channel = MethodChannel("me.polynom.moxplatform_android_bg");
|
|
||||||
final Logger _log;
|
|
||||||
|
|
||||||
AndroidBackgroundService()
|
|
||||||
: _log = Logger("AndroidBackgroundService"),
|
|
||||||
super();
|
|
||||||
|
|
||||||
@override
|
|
||||||
void setNotification(String title, String body) {
|
|
||||||
channel.invokeMethod(
|
|
||||||
"setNotificationBody",
|
|
||||||
[ body ]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void sendEvent(BackgroundEvent event, { String? id }) {
|
|
||||||
final data = DataWrapper(
|
|
||||||
id ?? const Uuid().v4(),
|
|
||||||
event
|
|
||||||
);
|
|
||||||
// NOTE: *S*erver to *F*oreground
|
|
||||||
_log.fine("S2F: ${data.toJson().toString()}");
|
|
||||||
channel.invokeMethod("sendData", jsonEncode(data.toJson()));
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void init(
|
|
||||||
Future<void> Function() entrypoint,
|
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleEvent
|
|
||||||
) {
|
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
|
||||||
|
|
||||||
// Ensure that all native plugins are registered against this FlutterEngine, so that
|
|
||||||
// we can use path_provider, notifications, ...
|
|
||||||
DartPluginRegistrant.ensureInitialized();
|
|
||||||
|
|
||||||
// Register the event handler
|
|
||||||
channel.setMethodCallHandler((MethodCall call) async {
|
|
||||||
await handleEvent(jsonDecode(call.arguments));
|
|
||||||
});
|
|
||||||
|
|
||||||
setNotification("Moxxy", "Preparing...");
|
|
||||||
|
|
||||||
_log.finest("Running...");
|
|
||||||
|
|
||||||
entrypoint();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,31 +1,31 @@
|
|||||||
import "dart:convert";
|
import 'dart:convert';
|
||||||
import "dart:ui";
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
import "package:moxplatform_android/service_android.dart";
|
import 'package:flutter/widgets.dart';
|
||||||
|
import 'package:get_it/get_it.dart';
|
||||||
import "package:flutter/widgets.dart";
|
import 'package:logging/logging.dart';
|
||||||
import "package:flutter/services.dart";
|
import 'package:moxlib/awaitabledatasender.dart';
|
||||||
import "package:logging/logging.dart";
|
import 'package:moxplatform/moxplatform.dart';
|
||||||
import "package:moxplatform_platform_interface/src/isolate.dart";
|
import 'package:moxplatform_android/src/service_android.dart';
|
||||||
import "package:moxplatform_platform_interface/src/service.dart";
|
import 'package:moxplatform_platform_interface/moxplatform_platform_interface.dart';
|
||||||
import "package:moxplatform/types.dart";
|
|
||||||
import "package:moxlib/awaitabledatasender.dart";
|
|
||||||
import "package:get_it/get_it.dart";
|
|
||||||
|
|
||||||
/// An [AwaitableDataSender] that uses flutter_background_service.
|
/// An [AwaitableDataSender] that uses flutter_background_service.
|
||||||
class BackgroundServiceDataSender extends AwaitableDataSender<BackgroundCommand, BackgroundEvent> {
|
class BackgroundServiceDataSender extends AwaitableDataSender<BackgroundCommand, BackgroundEvent> {
|
||||||
|
|
||||||
|
BackgroundServiceDataSender()
|
||||||
|
: _channel = const MethodChannel('me.polynom.moxplatform_android'), super();
|
||||||
final MethodChannel _channel;
|
final MethodChannel _channel;
|
||||||
BackgroundServiceDataSender() : _channel = MethodChannel("me.polynom.moxplatform_android"), super();
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> sendDataImpl(DataWrapper data) async {
|
Future<void> sendDataImpl(DataWrapper data) async {
|
||||||
await _channel.invokeMethod("sendData", jsonEncode(data.toJson()));
|
await _channel.invokeMethod<void>('sendData', jsonEncode(data.toJson()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@pragma('vm:entry-point')
|
@pragma('vm:entry-point')
|
||||||
Future<void> androidEntrypoint() async {
|
Future<void> androidEntrypoint() async {
|
||||||
print("androidEntrypoint: Called on new FlutterEngine");
|
// ignore: avoid_print
|
||||||
|
print('androidEntrypoint: Called on new FlutterEngine');
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -33,11 +33,15 @@ Future<void> androidEntrypoint() async {
|
|||||||
print(call.method);
|
print(call.method);
|
||||||
});*/
|
});*/
|
||||||
|
|
||||||
final data = jsonDecode(await AndroidBackgroundService.channel.invokeMethod("getExtraData", []));
|
final result = await AndroidBackgroundService.channel.invokeMethod<String>(
|
||||||
final int entrypointHandle = data["genericEntrypoint"]!;
|
'getExtraData',
|
||||||
|
<void>[],
|
||||||
|
);
|
||||||
|
final data = jsonDecode(result!) as Map<String, dynamic>;
|
||||||
|
final entrypointHandle = data['genericEntrypoint']! as int;
|
||||||
final entrypointCallbackHandle = CallbackHandle.fromRawHandle(entrypointHandle);
|
final entrypointCallbackHandle = CallbackHandle.fromRawHandle(entrypointHandle);
|
||||||
final entrypoint = PluginUtilities.getCallbackFromHandle(entrypointCallbackHandle);
|
final entrypoint = PluginUtilities.getCallbackFromHandle(entrypointCallbackHandle);
|
||||||
final int handleUIEventHandle = data["eventHandle"]!;
|
final handleUIEventHandle = data['eventHandle']! as int;
|
||||||
final handleUIEventCallbackHandle = CallbackHandle.fromRawHandle(handleUIEventHandle);
|
final handleUIEventCallbackHandle = CallbackHandle.fromRawHandle(handleUIEventHandle);
|
||||||
final handleUIEvent = PluginUtilities.getCallbackFromHandle(handleUIEventCallbackHandle);
|
final handleUIEvent = PluginUtilities.getCallbackFromHandle(handleUIEventCallbackHandle);
|
||||||
|
|
||||||
@ -45,26 +49,27 @@ Future<void> androidEntrypoint() async {
|
|||||||
GetIt.I.registerSingleton<BackgroundService>(srv);
|
GetIt.I.registerSingleton<BackgroundService>(srv);
|
||||||
srv.init(
|
srv.init(
|
||||||
entrypoint! as Future<void> Function(),
|
entrypoint! as Future<void> Function(),
|
||||||
handleUIEvent! as Future<void> Function(Map<String, dynamic>? data)
|
handleUIEvent! as Future<void> Function(Map<String, dynamic>? data),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The Android specific implementation of the [IsolateHandler].
|
/// The Android specific implementation of the [IsolateHandler].
|
||||||
class AndroidIsolateHandler extends IsolateHandler {
|
class AndroidIsolateHandler extends IsolateHandler {
|
||||||
|
|
||||||
|
AndroidIsolateHandler()
|
||||||
|
: _channel = const MethodChannel('me.polynom.moxplatform_android'),
|
||||||
|
_dataSender = BackgroundServiceDataSender(),
|
||||||
|
_log = Logger('AndroidIsolateHandler'),
|
||||||
|
super();
|
||||||
final BackgroundServiceDataSender _dataSender;
|
final BackgroundServiceDataSender _dataSender;
|
||||||
final MethodChannel _channel;
|
final MethodChannel _channel;
|
||||||
final Logger _log;
|
final Logger _log;
|
||||||
|
|
||||||
AndroidIsolateHandler()
|
|
||||||
: _channel = MethodChannel("me.polynom.moxplatform_android"),
|
|
||||||
_dataSender = BackgroundServiceDataSender(),
|
|
||||||
_log = Logger("AndroidIsolateHandler"),
|
|
||||||
super();
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> attach(Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent) async {
|
Future<void> attach(Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent) async {
|
||||||
_channel.setMethodCallHandler((MethodCall call) async {
|
_channel.setMethodCallHandler((MethodCall call) async {
|
||||||
await handleIsolateEvent(jsonDecode(call.arguments));
|
final args = call.arguments as String;
|
||||||
|
await handleIsolateEvent(jsonDecode(args) as Map<String, dynamic>);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,35 +77,35 @@ class AndroidIsolateHandler extends IsolateHandler {
|
|||||||
Future<void> start(
|
Future<void> start(
|
||||||
Future<void> Function() entrypoint,
|
Future<void> Function() entrypoint,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent,
|
||||||
) async {
|
) async {
|
||||||
_log.finest("Called start");
|
_log.finest('Called start');
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
final androidEntrypointHandle = PluginUtilities.getCallbackHandle(androidEntrypoint)!.toRawHandle();
|
final androidEntrypointHandle = PluginUtilities.getCallbackHandle(androidEntrypoint)!.toRawHandle();
|
||||||
_log.finest('androidEntrypointHandle: $androidEntrypointHandle');
|
_log.finest('androidEntrypointHandle: $androidEntrypointHandle');
|
||||||
await _channel.invokeMethod("configure", [
|
await _channel.invokeMethod<void>('configure', <dynamic>[
|
||||||
androidEntrypointHandle,
|
androidEntrypointHandle,
|
||||||
jsonEncode({
|
jsonEncode({
|
||||||
"genericEntrypoint": PluginUtilities.getCallbackHandle(entrypoint)!.toRawHandle(),
|
'genericEntrypoint': PluginUtilities.getCallbackHandle(entrypoint)!.toRawHandle(),
|
||||||
"eventHandle": PluginUtilities.getCallbackHandle(handleUIEvent)!.toRawHandle()
|
'eventHandle': PluginUtilities.getCallbackHandle(handleUIEvent)!.toRawHandle()
|
||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
await attach(handleIsolateEvent);
|
await attach(handleIsolateEvent);
|
||||||
|
|
||||||
final result = await _channel.invokeMethod("start", []);
|
final result = await _channel.invokeMethod<bool>('start', <void>[]);
|
||||||
if (result) {
|
if (result == true) {
|
||||||
_log.finest("Service successfully started");
|
_log.finest('Service successfully started');
|
||||||
} else {
|
} else {
|
||||||
_log.severe("Service failed to start");
|
_log.severe('Service failed to start');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<bool> isRunning() async {
|
Future<bool> isRunning() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
return await _channel.invokeMethod("isRunning", []);
|
return (await _channel.invokeMethod<bool>('isRunning', <void>[])) == true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
@ -1,5 +1,5 @@
|
|||||||
import "package:moxplatform_platform_interface/src/media.dart";
|
import 'package:media_scanner/media_scanner.dart';
|
||||||
import "package:media_scanner/media_scanner.dart";
|
import 'package:moxplatform_platform_interface/moxplatform_platform_interface.dart';
|
||||||
|
|
||||||
class AndroidMediaScannerImplementation extends MediaScannerImplementation {
|
class AndroidMediaScannerImplementation extends MediaScannerImplementation {
|
||||||
@override
|
@override
|
15
packages/moxplatform_android/lib/src/plugin_android.dart
Normal file
15
packages/moxplatform_android/lib/src/plugin_android.dart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import 'package:moxplatform_android/src/isolate_android.dart';
|
||||||
|
import 'package:moxplatform_android/src/media_android.dart';
|
||||||
|
import 'package:moxplatform_platform_interface/moxplatform_platform_interface.dart';
|
||||||
|
|
||||||
|
class MoxplatformAndroidPlugin extends MoxplatformInterface {
|
||||||
|
static void registerWith() {
|
||||||
|
// ignore: avoid_print
|
||||||
|
print('MoxplatformAndroidPlugin: Registering implementation');
|
||||||
|
MoxplatformInterface.handler = AndroidIsolateHandler();
|
||||||
|
MoxplatformInterface.media = AndroidMediaScannerImplementation();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<String> getPlatformName() async => 'Android';
|
||||||
|
}
|
64
packages/moxplatform_android/lib/src/service_android.dart
Normal file
64
packages/moxplatform_android/lib/src/service_android.dart
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
import 'dart:ui';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:meta/meta.dart';
|
||||||
|
import 'package:moxlib/awaitabledatasender.dart';
|
||||||
|
import 'package:moxplatform/moxplatform.dart';
|
||||||
|
import 'package:moxplatform_platform_interface/moxplatform_platform_interface.dart';
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
|
|
||||||
|
class AndroidBackgroundService extends BackgroundService {
|
||||||
|
|
||||||
|
AndroidBackgroundService()
|
||||||
|
: _log = Logger('AndroidBackgroundService'),
|
||||||
|
super();
|
||||||
|
|
||||||
|
@internal
|
||||||
|
static const MethodChannel channel = MethodChannel('me.polynom.moxplatform_android_bg');
|
||||||
|
final Logger _log;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void setNotification(String title, String body) {
|
||||||
|
channel.invokeMethod<void>(
|
||||||
|
'setNotificationBody',
|
||||||
|
[body],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void sendEvent(BackgroundEvent event, { String? id }) {
|
||||||
|
final data = DataWrapper(
|
||||||
|
id ?? const Uuid().v4(),
|
||||||
|
event,
|
||||||
|
);
|
||||||
|
// NOTE: *S*erver to *F*oreground
|
||||||
|
_log.fine('S2F: ${data.toJson().toString()}');
|
||||||
|
channel.invokeMethod<void>('sendData', jsonEncode(data.toJson()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void init(
|
||||||
|
Future<void> Function() entrypoint,
|
||||||
|
Future<void> Function(Map<String, dynamic>? data) handleEvent,
|
||||||
|
) {
|
||||||
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
|
// Ensure that all native plugins are registered against this FlutterEngine, so that
|
||||||
|
// we can use path_provider, notifications, ...
|
||||||
|
DartPluginRegistrant.ensureInitialized();
|
||||||
|
|
||||||
|
// Register the event handler
|
||||||
|
channel.setMethodCallHandler((MethodCall call) async {
|
||||||
|
final args = call.arguments! as String;
|
||||||
|
await handleEvent(jsonDecode(args) as Map<String, dynamic>);
|
||||||
|
});
|
||||||
|
|
||||||
|
setNotification('Moxxy', 'Preparing...');
|
||||||
|
|
||||||
|
_log.finest('Running...');
|
||||||
|
|
||||||
|
entrypoint();
|
||||||
|
}
|
||||||
|
}
|
@ -20,23 +20,25 @@ flutter:
|
|||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
moxplatform_platform_interface:
|
get_it: 7.2.0
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
logging: 1.0.2
|
||||||
version: 0.1.11
|
media_scanner: 2.0.0
|
||||||
moxplatform:
|
meta: ^1.7.0
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
|
||||||
version: 0.1.11
|
|
||||||
|
|
||||||
moxlib:
|
moxlib:
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
version: 0.1.4
|
version: 0.1.4
|
||||||
logging: 1.0.2
|
|
||||||
get_it: 7.2.0
|
moxplatform:
|
||||||
uuid: 3.0.5
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
media_scanner: 2.0.0
|
version: 0.1.11
|
||||||
|
moxplatform_platform_interface:
|
||||||
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
|
version: 0.1.11
|
||||||
|
|
||||||
plugin_platform_interface: 2.1.2
|
plugin_platform_interface: 2.1.2
|
||||||
meta: ^1.7.0
|
uuid: 3.0.5
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
very_good_analysis: 2.4.0
|
||||||
|
@ -1,4 +1 @@
|
|||||||
include: package:flutter_lints/flutter.yaml
|
include: ../../analysis_options.yaml
|
||||||
|
|
||||||
# Additional information about this file can be found at
|
|
||||||
# https://dart.dev/guides/language/analysis-options
|
|
||||||
|
@ -30,3 +30,4 @@ dev_dependencies:
|
|||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
very_good_analysis: 2.4.0
|
||||||
|
@ -1,4 +1 @@
|
|||||||
include: package:flutter_lints/flutter.yaml
|
include: ../../analysis_options.yaml
|
||||||
|
|
||||||
# Additional information about this file can be found at
|
|
||||||
# https://dart.dev/guides/language/analysis-options
|
|
||||||
|
@ -12,9 +12,8 @@ dependencies:
|
|||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
moxplatform:
|
moxplatform:
|
||||||
path: ../moxplatform
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
#hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
version: 0.1.11
|
||||||
#version: 0.1.11
|
|
||||||
moxplatform_generic:
|
moxplatform_generic:
|
||||||
path: ../moxplatform_generic
|
path: ../moxplatform_generic
|
||||||
|
|
||||||
@ -22,6 +21,7 @@ dev_dependencies:
|
|||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
flutter_lints: ^2.0.0
|
flutter_lints: ^2.0.0
|
||||||
|
very_good_analysis: 2.4.0
|
||||||
|
|
||||||
flutter:
|
flutter:
|
||||||
plugin:
|
plugin:
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
include: ../../analysis_options.yaml
|
@ -1,29 +1,8 @@
|
|||||||
import "package:moxplatform_platform_interface/src/isolate.dart";
|
library moxplatform_platform_interface;
|
||||||
import "package:moxplatform_platform_interface/src/isolate_stub.dart";
|
|
||||||
import "package:moxplatform_platform_interface/src/media.dart";
|
|
||||||
import "package:moxplatform_platform_interface/src/media_stub.dart";
|
|
||||||
import "package:plugin_platform_interface/plugin_platform_interface.dart";
|
|
||||||
|
|
||||||
abstract class MoxplatformInterface extends PlatformInterface {
|
export 'src/interface.dart';
|
||||||
/// Constructs a MyPluginPlatform.
|
export 'src/isolate.dart';
|
||||||
MoxplatformInterface() : super(token: _token);
|
export 'src/isolate_stub.dart';
|
||||||
|
export 'src/media.dart';
|
||||||
static final Object _token = Object();
|
export 'src/media_stub.dart';
|
||||||
|
export 'src/service.dart';
|
||||||
static IsolateHandler _handler = StubIsolateHandler();
|
|
||||||
static MediaScannerImplementation _media = StubMediaScannerImplementation();
|
|
||||||
|
|
||||||
static IsolateHandler get handler => _handler;
|
|
||||||
static set handler(IsolateHandler instance) {
|
|
||||||
_handler = instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
static MediaScannerImplementation get media => _media;
|
|
||||||
static set media(MediaScannerImplementation instance) {
|
|
||||||
_media = instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// Return the current platform name.
|
|
||||||
Future<String?> getPlatformName();
|
|
||||||
}
|
|
||||||
|
@ -0,0 +1,17 @@
|
|||||||
|
import 'package:moxplatform_platform_interface/src/isolate.dart';
|
||||||
|
import 'package:moxplatform_platform_interface/src/isolate_stub.dart';
|
||||||
|
import 'package:moxplatform_platform_interface/src/media.dart';
|
||||||
|
import 'package:moxplatform_platform_interface/src/media_stub.dart';
|
||||||
|
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
|
||||||
|
|
||||||
|
abstract class MoxplatformInterface extends PlatformInterface {
|
||||||
|
MoxplatformInterface() : super(token: _token);
|
||||||
|
|
||||||
|
static final Object _token = Object();
|
||||||
|
|
||||||
|
static IsolateHandler handler = StubIsolateHandler();
|
||||||
|
static MediaScannerImplementation media = StubMediaScannerImplementation();
|
||||||
|
|
||||||
|
/// Return the current platform name.
|
||||||
|
Future<String?> getPlatformName();
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import "package:moxlib/awaitabledatasender.dart";
|
import 'package:moxlib/awaitabledatasender.dart';
|
||||||
|
|
||||||
/// A class abstracting the interaction between the UI isolate and the background
|
/// A class abstracting the interaction between the UI isolate and the background
|
||||||
/// service, which is either a regular isolate or an Android foreground service.
|
/// service, which is either a regular isolate or an Android foreground service.
|
||||||
@ -6,17 +6,17 @@ import "package:moxlib/awaitabledatasender.dart";
|
|||||||
abstract class IsolateHandler {
|
abstract class IsolateHandler {
|
||||||
/// Start the background service.
|
/// Start the background service.
|
||||||
/// [entrypoint] is the entrypoint that is run inside the new isolate.
|
/// [entrypoint] is the entrypoint that is run inside the new isolate.
|
||||||
/// [handeUiEvent] is a handler function that is called when the isolate receives data from the UI.
|
/// [handleUIEvent] is a handler function that is called when the isolate receives data from the UI.
|
||||||
/// [handleIsolateEvent] is a handler function that is called when the UI receives data from the service.
|
/// [handleIsolateEvent] is a handler function that is called when the UI receives data from the service.
|
||||||
Future<void> start(
|
Future<void> start(
|
||||||
Future<void> Function() entrypoint,
|
Future<void> Function() entrypoint,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Make sure that the UI event handler is registered without starting the isolate.
|
/// Make sure that the UI event handler is registered without starting the isolate.
|
||||||
Future<void> attach(
|
Future<void> attach(
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent,
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Return true if the background service is running. False if it's not.
|
/// Return true if the background service is running. False if it's not.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import "package:moxlib/awaitabledatasender.dart";
|
import 'package:moxlib/awaitabledatasender.dart';
|
||||||
import "package:moxplatform_platform_interface/src/isolate.dart";
|
import 'package:moxplatform_platform_interface/src/isolate.dart';
|
||||||
|
|
||||||
class StubDataSender extends AwaitableDataSender {
|
class StubDataSender extends AwaitableDataSender {
|
||||||
StubDataSender() : super();
|
StubDataSender() : super();
|
||||||
@ -9,24 +9,25 @@ class StubDataSender extends AwaitableDataSender {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class StubIsolateHandler extends IsolateHandler {
|
class StubIsolateHandler extends IsolateHandler {
|
||||||
final StubDataSender _sender;
|
|
||||||
|
|
||||||
StubIsolateHandler() : _sender = StubDataSender();
|
StubIsolateHandler() : _sender = StubDataSender();
|
||||||
|
final StubDataSender _sender;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> attach(
|
Future<void> attach(
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent,
|
||||||
) async {
|
) async {
|
||||||
print("STUB ATTACHED!!!!!!");
|
// ignore: avoid_print
|
||||||
|
print('STUB ATTACHED!!!!!!');
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> start(
|
Future<void> start(
|
||||||
Future<void> Function() entrypoint,
|
Future<void> Function() entrypoint,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
Future<void> Function(Map<String, dynamic>? data) handleUIEvent,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent
|
Future<void> Function(Map<String, dynamic>? data) handleIsolateEvent,
|
||||||
) async {
|
) async {
|
||||||
print("STUB STARTED!!!!!!");
|
// ignore: avoid_print
|
||||||
|
print('STUB STARTED!!!!!!');
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
/// Wrapper around platform-specific media scanning
|
/// Wrapper around platform-specific media scanning
|
||||||
|
// ignore: one_member_abstracts
|
||||||
abstract class MediaScannerImplementation {
|
abstract class MediaScannerImplementation {
|
||||||
/// Let the platform-specific media scanner scan the file at [path].
|
/// Let the platform-specific media scanner scan the file at [path].
|
||||||
void scanFile(String path);
|
void scanFile(String path);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import "package:moxplatform_platform_interface/src/media.dart";
|
import 'package:moxplatform_platform_interface/src/media.dart';
|
||||||
|
|
||||||
class StubMediaScannerImplementation extends MediaScannerImplementation {
|
class StubMediaScannerImplementation extends MediaScannerImplementation {
|
||||||
@override
|
@override
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import "package:moxplatform/types.dart";
|
import 'package:moxplatform/moxplatform.dart';
|
||||||
|
|
||||||
abstract class BackgroundService {
|
abstract class BackgroundService {
|
||||||
/// Set the notification of the background service, if available
|
/// Set the notification of the background service, if available
|
||||||
@ -12,6 +12,6 @@ abstract class BackgroundService {
|
|||||||
/// data.
|
/// data.
|
||||||
void init(
|
void init(
|
||||||
Future<void> Function() entrypoint,
|
Future<void> Function() entrypoint,
|
||||||
Future<void> Function(Map<String, dynamic>? data) handleEvent
|
Future<void> Function(Map<String, dynamic>? data) handleEvent,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -12,15 +12,16 @@ dependencies:
|
|||||||
flutter:
|
flutter:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
|
||||||
|
moxlib:
|
||||||
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
|
version: 0.1.4
|
||||||
moxplatform:
|
moxplatform:
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
||||||
version: 0.1.11
|
version: 0.1.11
|
||||||
|
|
||||||
moxlib:
|
|
||||||
hosted: https://git.polynom.me/api/packages/Moxxy/pub
|
|
||||||
version: 0.1.4
|
|
||||||
plugin_platform_interface: 2.1.2
|
plugin_platform_interface: 2.1.2
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
flutter_test:
|
flutter_test:
|
||||||
sdk: flutter
|
sdk: flutter
|
||||||
|
very_good_analysis: 2.4.0
|
||||||
|
Reference in New Issue
Block a user