diff --git a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt index d2cd420..45964df 100644 --- a/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt +++ b/android/src/main/kotlin/com/gianlucaparadise/flutter_cast_framework/FlutterCastFrameworkPlugin.kt @@ -1,17 +1,26 @@ package com.gianlucaparadise.flutter_cast_framework +import android.util.Log +import com.google.android.gms.cast.framework.CastContext import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result import io.flutter.plugin.common.PluginRegistry.Registrar -class FlutterCastFrameworkPlugin: MethodCallHandler { +class FlutterCastFrameworkPlugin(registrar: Registrar, private val channel: MethodChannel): MethodCallHandler { companion object { @JvmStatic fun registerWith(registrar: Registrar) { val channel = MethodChannel(registrar.messenger(), "flutter_cast_framework") - channel.setMethodCallHandler(FlutterCastFrameworkPlugin()) + channel.setMethodCallHandler(FlutterCastFrameworkPlugin(registrar, channel)) + } + } + + init { + CastContext.getSharedInstance(registrar.activeContext()).addCastStateListener { i -> + Log.d("Android", "Method call on flutter: $i") + channel.invokeMethod("onCastStateChanged", i) } } diff --git a/example/lib/main.dart b/example/lib/main.dart index 12626e9..d36b8b6 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'dart:async'; - -import 'package:flutter/services.dart'; +import 'package:flutter_cast_framework/cast/CastContext.dart'; import 'package:flutter_cast_framework/flutter_cast_framework.dart'; void main() => runApp(MyApp()); @@ -12,31 +10,17 @@ class MyApp extends StatefulWidget { } class _MyAppState extends State { - String _platformVersion = 'Unknown'; + CastState _castState; @override void initState() { super.initState(); - initPlatformState(); + FlutterCastFramework.castContext.state.addListener(_onCastStateChanged); } - // Platform messages are asynchronous, so we initialize in an async method. - Future initPlatformState() async { - String platformVersion; - // Platform messages may fail, so we use a try/catch PlatformException. - try { - platformVersion = await FlutterCastFramework.platformVersion; - } on PlatformException { - platformVersion = 'Failed to get platform version.'; - } - - // If the widget was removed from the tree while the asynchronous platform - // message was in flight, we want to discard the reply rather than calling - // setState to update our non-existent appearance. - if (!mounted) return; - + void _onCastStateChanged() { setState(() { - _platformVersion = platformVersion; + _castState = FlutterCastFramework.castContext.state.value; }); } @@ -48,7 +32,7 @@ class _MyAppState extends State { title: const Text('Cast plugin example app'), ), body: Center( - child: Text('Running on: $_platformVersion\n'), + child: Text('Cast State: $_castState'), ), ), ); diff --git a/lib/cast/CastContext.dart b/lib/cast/CastContext.dart new file mode 100644 index 0000000..cd35bfb --- /dev/null +++ b/lib/cast/CastContext.dart @@ -0,0 +1,19 @@ +import 'package:flutter/foundation.dart'; + +class CastContext { + static final _instance = new CastContext._internal(); + + CastContext._internal(); + + static CastContext get instance => _instance; + + final ValueNotifier state = ValueNotifier(CastState.unavailable); +} + +enum CastState { + default_state, // 0 + unavailable, // 1 + unconnected, // 2 + connecting, // 3 + connected, // 4 +} \ No newline at end of file diff --git a/lib/flutter_cast_framework.dart b/lib/flutter_cast_framework.dart index 7a6d78d..c8e7416 100644 --- a/lib/flutter_cast_framework.dart +++ b/lib/flutter_cast_framework.dart @@ -1,13 +1,34 @@ -import 'dart:async'; - +import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_cast_framework/cast/CastContext.dart'; class FlutterCastFramework { - static const MethodChannel _channel = - const MethodChannel('flutter_cast_framework'); - static Future get platformVersion async { - final String version = await _channel.invokeMethod('getPlatformVersion'); - return version; + static const MethodChannel _channel = const MethodChannel('flutter_cast_framework'); + + static bool _isInitiated = false; + static _init() { + _channel.setMethodCallHandler((MethodCall call) async { + String method = call.method; + dynamic arguments = call.arguments; + debugPrint("Method call on flutter: $method $arguments"); + + switch (method) { + case "onCastStateChanged": + int castState = arguments; + castContext.state.value = CastState.values[castState]; + break; + + default: + debugPrint("Method not handled: $method"); + break; + } + }); + } + + // This must be the plugin entry point + static CastContext get castContext { + if (!_isInitiated) _init(); + return CastContext.instance; } } diff --git a/test/flutter_cast_framework_test.dart b/test/flutter_cast_framework_test.dart index 88a0f6c..7210776 100644 --- a/test/flutter_cast_framework_test.dart +++ b/test/flutter_cast_framework_test.dart @@ -1,6 +1,5 @@ import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:flutter_cast_framework/flutter_cast_framework.dart'; void main() { const MethodChannel channel = MethodChannel('flutter_cast_framework'); @@ -16,6 +15,6 @@ void main() { }); test('getPlatformVersion', () async { - expect(await FlutterCastFramework.platformVersion, '42'); + // expect(await FlutterCastFramework.platformVersion, '42'); }); }