Initial CastContext setup;

CastState handling
This commit is contained in:
gianlucaparadise 2019-11-08 06:52:35 +01:00
parent e8dc95aaa1
commit 344c5b6b8a
5 changed files with 65 additions and 33 deletions

View file

@ -1,17 +1,26 @@
package com.gianlucaparadise.flutter_cast_framework 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.MethodCall
import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.PluginRegistry.Registrar import io.flutter.plugin.common.PluginRegistry.Registrar
class FlutterCastFrameworkPlugin: MethodCallHandler { class FlutterCastFrameworkPlugin(registrar: Registrar, private val channel: MethodChannel): MethodCallHandler {
companion object { companion object {
@JvmStatic @JvmStatic
fun registerWith(registrar: Registrar) { fun registerWith(registrar: Registrar) {
val channel = MethodChannel(registrar.messenger(), "flutter_cast_framework") 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)
} }
} }

View file

@ -1,7 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async'; import 'package:flutter_cast_framework/cast/CastContext.dart';
import 'package:flutter/services.dart';
import 'package:flutter_cast_framework/flutter_cast_framework.dart'; import 'package:flutter_cast_framework/flutter_cast_framework.dart';
void main() => runApp(MyApp()); void main() => runApp(MyApp());
@ -12,31 +10,17 @@ class MyApp extends StatefulWidget {
} }
class _MyAppState extends State<MyApp> { class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown'; CastState _castState;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
initPlatformState(); FlutterCastFramework.castContext.state.addListener(_onCastStateChanged);
} }
// Platform messages are asynchronous, so we initialize in an async method. void _onCastStateChanged() {
Future<void> 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;
setState(() { setState(() {
_platformVersion = platformVersion; _castState = FlutterCastFramework.castContext.state.value;
}); });
} }
@ -48,7 +32,7 @@ class _MyAppState extends State<MyApp> {
title: const Text('Cast plugin example app'), title: const Text('Cast plugin example app'),
), ),
body: Center( body: Center(
child: Text('Running on: $_platformVersion\n'), child: Text('Cast State: $_castState'),
), ),
), ),
); );

19
lib/cast/CastContext.dart Normal file
View file

@ -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<CastState> state = ValueNotifier(CastState.unavailable);
}
enum CastState {
default_state, // 0
unavailable, // 1
unconnected, // 2
connecting, // 3
connected, // 4
}

View file

@ -1,13 +1,34 @@
import 'dart:async'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_cast_framework/cast/CastContext.dart';
class FlutterCastFramework { class FlutterCastFramework {
static const MethodChannel _channel =
const MethodChannel('flutter_cast_framework');
static Future<String> get platformVersion async { static const MethodChannel _channel = const MethodChannel('flutter_cast_framework');
final String version = await _channel.invokeMethod('getPlatformVersion');
return version; 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;
} }
} }

View file

@ -1,6 +1,5 @@
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_cast_framework/flutter_cast_framework.dart';
void main() { void main() {
const MethodChannel channel = MethodChannel('flutter_cast_framework'); const MethodChannel channel = MethodChannel('flutter_cast_framework');
@ -16,6 +15,6 @@ void main() {
}); });
test('getPlatformVersion', () async { test('getPlatformVersion', () async {
expect(await FlutterCastFramework.platformVersion, '42'); // expect(await FlutterCastFramework.platformVersion, '42');
}); });
} }