[mob][cast] Refactor + add multiple cast plugin to gracefully handle fdroid

This commit is contained in:
Neeraj Gupta 2024-04-23 15:55:22 +05:30
parent 8fd330c304
commit 89646ac469
20 changed files with 532 additions and 51 deletions

View file

@ -1,7 +1,25 @@
import "package:dio/dio.dart";
import "package:ente_cast/ente_cast.dart";
import "package:ente_cast_normal/ente_cast_normal.dart";
import "package:ente_feature_flag/ente_feature_flag.dart";
import "package:shared_preferences/shared_preferences.dart";
CastService? _castService;
CastService get castService {
_castService ??= CastServiceImpl();
return _castService!;
}
FlagService? _flagService;
FlagService get flagService {
_flagService ??= FlagService(
ServiceLocator.instance.prefs,
ServiceLocator.instance.enteDio,
);
return _flagService!;
}
class ServiceLocator {
late final SharedPreferences prefs;
late final Dio enteDio;
@ -16,13 +34,3 @@ class ServiceLocator {
this.enteDio = enteDio;
}
}
FlagService? _flagService;
FlagService get flagService {
_flagService ??= FlagService(
ServiceLocator.instance.prefs,
ServiceLocator.instance.enteDio,
);
return _flagService!;
}

View file

@ -2,10 +2,6 @@ import 'dart:async';
import 'dart:io';
import 'dart:math' as math;
import "package:cast/device.dart";
import "package:cast/discovery_service.dart";
import "package:cast/session.dart";
import "package:cast/session_manager.dart";
import "package:flutter/cupertino.dart";
import 'package:flutter/material.dart';
import 'package:logging/logging.dart';
@ -580,7 +576,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
),
);
}
if (widget.collection != null) {
if (widget.collection != null && castService.isSupported) {
actions.add(castWidget(context));
}
if (items.isNotEmpty) {
@ -650,8 +646,8 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
}
Widget castWidget(BuildContext context) {
return FutureBuilder<List<CastDevice>>(
future: CastDiscoveryService().search(),
return FutureBuilder<List<Object>>(
future: castService.searchDevices(),
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
@ -679,7 +675,7 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
showGenericErrorDialog(context: context, error: e).ignore();
}
},
child: Text( device.name),
child: Text(device.toString()),
);
}).toList(),
);
@ -689,35 +685,9 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
Future<void> _connectToYourApp(
BuildContext context,
CastDevice object,
Object castDevice,
) async {
final session = await CastSessionManager().startSession(object);
session.stateStream.listen((state) {
if (state == CastSessionState.connected) {
const snackBar = SnackBar(content: Text('Connected'));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
_sendPairingRequestToTV(session);
}
});
session.messageStream.listen((message) {
print('receive message: $message');
});
session.sendMessage(CastSession.kNamespaceReceiver, {
'type': 'LAUNCH',
'appId': 'F5BCEC64', // set the appId of your app here
});
_sendPairingRequestToTV(session);
}
void _sendPairingRequestToTV(CastSession session) {
print('_sendMessageToYourApp');
session.sendMessage('urn:x-cast:pair-request', {});
await castService.connectDevice(context, castDevice);
}
Future<void> onCleanUncategorizedClick(BuildContext buildContext) async {

View file

@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
channel: stable
project_type: plugin

View file

@ -0,0 +1 @@
include: ../../analysis_options.yaml

View file

@ -0,0 +1 @@
export 'src/service.dart';

View file

@ -0,0 +1,7 @@
import "package:flutter/widgets.dart";
abstract class CastService {
bool get isSupported;
Future<List<Object>> searchDevices();
Future<void> connectDevice(BuildContext context, Object device);
}

View file

@ -0,0 +1,19 @@
name: ente_cast
version: 0.0.1
publish_to: none
environment:
sdk: '>=3.3.0 <4.0.0'
dependencies:
collection:
dio: ^4.0.6
flutter:
sdk: flutter
shared_preferences: ^2.0.5
stack_trace:
dev_dependencies:
flutter_lints:
flutter:

View file

@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
channel: stable
project_type: plugin

View file

@ -0,0 +1 @@
include: ../../analysis_options.yaml

View file

@ -0,0 +1 @@
export 'src/service.dart';

View file

@ -0,0 +1,17 @@
import "package:ente_cast/ente_cast.dart";
import "package:flutter/widgets.dart";
class CastServiceImpl extends CastService {
@override
Future<void> connectDevice(BuildContext context, Object device) {
throw UnimplementedError();
}
@override
Future<List<Object>> searchDevices() {
throw UnimplementedError();
}
@override
bool get isSupported => false;
}

View file

@ -0,0 +1,18 @@
name: ente_cast_none
version: 0.0.1
publish_to: none
environment:
sdk: '>=3.3.0 <4.0.0'
dependencies:
ente_cast:
path: ../ente_cast
flutter:
sdk: flutter
stack_trace:
dev_dependencies:
flutter_lints:
flutter:

View file

@ -0,0 +1,10 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
version:
revision: 0b8abb4724aa590dd0f429683339b1e045a1594d
channel: stable
project_type: plugin

View file

@ -0,0 +1 @@
include: ../../analysis_options.yaml

View file

@ -0,0 +1 @@
export 'src/service.dart';

View file

@ -0,0 +1,37 @@
import "package:cast/cast.dart";
import "package:ente_cast/ente_cast.dart";
import "package:flutter/material.dart";
class CastServiceImpl extends CastService {
@override
Future<void> connectDevice(BuildContext context, Object device) async {
final CastDevice castDevice = device as CastDevice;
final session = await CastSessionManager().startSession(castDevice);
session.stateStream.listen((state) {
if (state == CastSessionState.connected) {
const snackBar = SnackBar(content: Text('Connected'));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
session.sendMessage('urn:x-cast:pair-request', {});
}
});
session.messageStream.listen((message) {
print('receive message: $message');
});
session.sendMessage(CastSession.kNamespaceReceiver, {
'type': 'LAUNCH',
'appId': 'F5BCEC64', // set the appId of your app here
});
session.sendMessage('urn:x-cast:pair-request', {});
}
@override
Future<List<Object>> searchDevices() {
// TODO: implement searchDevices
throw UnimplementedError();
}
@override
bool get isSupported => true;
}

View file

@ -0,0 +1,333 @@
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
packages:
async:
dependency: transitive
description:
name: async
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.11.0"
cast:
dependency: "direct main"
description:
path: "."
ref: multicast_version
resolved-ref: "1f39cd4d6efa9363e77b2439f0317bae0c92dda1"
url: "https://github.com/guyluz11/flutter_cast.git"
source: git
version: "2.0.9"
characters:
dependency: transitive
description:
name: characters
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.3.0"
collection:
dependency: transitive
description:
name: collection
sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev"
source: hosted
version: "1.18.0"
dio:
dependency: transitive
description:
name: dio
sha256: "7d328c4d898a61efc3cd93655a0955858e29a0aa647f0f9e02d59b3bb275e2e8"
url: "https://pub.dev"
source: hosted
version: "4.0.6"
ente_cast:
dependency: "direct main"
description:
path: "../ente_cast"
relative: true
source: path
version: "0.0.1"
ffi:
dependency: transitive
description:
name: ffi
sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
file:
dependency: transitive
description:
name: file
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
source: hosted
version: "7.0.0"
fixnum:
dependency: transitive
description:
name: fixnum
sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1"
url: "https://pub.dev"
source: hosted
version: "1.1.0"
flutter:
dependency: "direct main"
description: flutter
source: sdk
version: "0.0.0"
flutter_lints:
dependency: "direct dev"
description:
name: flutter_lints
sha256: "9e8c3858111da373efc5aa341de011d9bd23e2c5c5e0c62bccf32438e192d7b1"
url: "https://pub.dev"
source: hosted
version: "3.0.2"
flutter_web_plugins:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
http:
dependency: transitive
description:
name: http
sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938"
url: "https://pub.dev"
source: hosted
version: "1.2.1"
http_parser:
dependency: transitive
description:
name: http_parser
sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
url: "https://pub.dev"
source: hosted
version: "4.0.2"
lints:
dependency: transitive
description:
name: lints
sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290
url: "https://pub.dev"
source: hosted
version: "3.0.0"
material_color_utilities:
dependency: transitive
description:
name: material_color_utilities
sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a"
url: "https://pub.dev"
source: hosted
version: "0.8.0"
meta:
dependency: transitive
description:
name: meta
sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04
url: "https://pub.dev"
source: hosted
version: "1.11.0"
multicast_dns:
dependency: transitive
description:
name: multicast_dns
sha256: "316cc47a958d4bd3c67bd238fe8b44fdfb6133bad89cb191c0c3bd3edb14e296"
url: "https://pub.dev"
source: hosted
version: "0.3.2+6"
path:
dependency: transitive
description:
name: path
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.9.0"
path_provider_linux:
dependency: transitive
description:
name: path_provider_linux
sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279
url: "https://pub.dev"
source: hosted
version: "2.2.1"
path_provider_platform_interface:
dependency: transitive
description:
name: path_provider_platform_interface
sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
path_provider_windows:
dependency: transitive
description:
name: path_provider_windows
sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170"
url: "https://pub.dev"
source: hosted
version: "2.2.1"
platform:
dependency: transitive
description:
name: platform
sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec"
url: "https://pub.dev"
source: hosted
version: "3.1.4"
plugin_platform_interface:
dependency: transitive
description:
name: plugin_platform_interface
sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02"
url: "https://pub.dev"
source: hosted
version: "2.1.8"
protobuf:
dependency: transitive
description:
name: protobuf
sha256: "68645b24e0716782e58948f8467fd42a880f255096a821f9e7d0ec625b00c84d"
url: "https://pub.dev"
source: hosted
version: "3.1.0"
shared_preferences:
dependency: transitive
description:
name: shared_preferences
sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180
url: "https://pub.dev"
source: hosted
version: "2.2.3"
shared_preferences_android:
dependency: transitive
description:
name: shared_preferences_android
sha256: "1ee8bf911094a1b592de7ab29add6f826a7331fb854273d55918693d5364a1f2"
url: "https://pub.dev"
source: hosted
version: "2.2.2"
shared_preferences_foundation:
dependency: transitive
description:
name: shared_preferences_foundation
sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c"
url: "https://pub.dev"
source: hosted
version: "2.3.5"
shared_preferences_linux:
dependency: transitive
description:
name: shared_preferences_linux
sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
shared_preferences_platform_interface:
dependency: transitive
description:
name: shared_preferences_platform_interface
sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
shared_preferences_web:
dependency: transitive
description:
name: shared_preferences_web
sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a"
url: "https://pub.dev"
source: hosted
version: "2.3.0"
shared_preferences_windows:
dependency: transitive
description:
name: shared_preferences_windows
sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59"
url: "https://pub.dev"
source: hosted
version: "2.3.2"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
name: source_span
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.10.0"
stack_trace:
dependency: "direct main"
description:
name: stack_trace
sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev"
source: hosted
version: "1.11.1"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
url: "https://pub.dev"
source: hosted
version: "1.2.0"
term_glyph:
dependency: transitive
description:
name: term_glyph
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.1"
typed_data:
dependency: transitive
description:
name: typed_data
sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
url: "https://pub.dev"
source: hosted
version: "1.3.2"
vector_math:
dependency: transitive
description:
name: vector_math
sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
url: "https://pub.dev"
source: hosted
version: "2.1.4"
web:
dependency: transitive
description:
name: web
sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27"
url: "https://pub.dev"
source: hosted
version: "0.5.1"
win32:
dependency: transitive
description:
name: win32
sha256: "0a989dc7ca2bb51eac91e8fd00851297cfffd641aa7538b165c62637ca0eaa4a"
url: "https://pub.dev"
source: hosted
version: "5.4.0"
xdg_directories:
dependency: transitive
description:
name: xdg_directories
sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d
url: "https://pub.dev"
source: hosted
version: "1.0.4"
sdks:
dart: ">=3.3.0 <4.0.0"
flutter: ">=3.19.0"

View file

@ -0,0 +1,22 @@
name: ente_cast_normal
version: 0.0.1
publish_to: none
environment:
sdk: '>=3.3.0 <4.0.0'
dependencies:
cast:
git:
url: https://github.com/guyluz11/flutter_cast.git
ref: multicast_version
ente_cast:
path: ../ente_cast
flutter:
sdk: flutter
stack_trace:
dev_dependencies:
flutter_lints:
flutter:

View file

@ -210,7 +210,7 @@ packages:
source: hosted
version: "1.1.1"
cast:
dependency: "direct main"
dependency: transitive
description:
path: "."
ref: multicast_version
@ -443,6 +443,20 @@ packages:
url: "https://pub.dev"
source: hosted
version: "2.1.17"
ente_cast:
dependency: "direct main"
description:
path: "plugins/ente_cast"
relative: true
source: path
version: "0.0.1"
ente_cast_normal:
dependency: "direct main"
description:
path: "plugins/ente_cast_normal"
relative: true
source: path
version: "0.0.1"
ente_feature_flag:
dependency: "direct main"
description:

View file

@ -27,10 +27,6 @@ dependencies:
battery_info: ^1.1.1
bip39: ^1.0.6
cached_network_image: ^3.0.0
cast:
git:
url: https://github.com/guyluz11/flutter_cast.git
ref: multicast_version
chewie:
git:
url: https://github.com/ente-io/chewie.git
@ -51,6 +47,10 @@ dependencies:
dotted_border: ^2.1.0
dropdown_button2: ^2.0.0
email_validator: ^2.0.1
ente_cast:
path: plugins/ente_cast
ente_cast_normal:
path: plugins/ente_cast_normal
ente_feature_flag:
path: plugins/ente_feature_flag
equatable: ^2.0.5