From b6ee8e2e214d39ac537e5cf56422b12356d81b61 Mon Sep 17 00:00:00 2001 From: Ahmadreza Zibaei Date: Sat, 13 Oct 2018 19:33:18 +0330 Subject: [PATCH] final ! :( --- android/app/src/main/AndroidManifest.xml | 1 + lib/config/application.dart | 40 +-- lib/models/Series.dart | 1 + lib/models/Settings.dart | 53 +++ lib/pages/capture.dart | 178 +++++++--- lib/pages/home.dart | 3 + lib/pages/item-view.dart | 314 +++++++++++++++++- lib/pages/selected-series.dart | 16 + lib/pages/settings.dart | 51 ++- lib/pages/splash-screen.dart | 18 +- lib/utils/card.dart | 49 +-- packages/flutter_video_launcher/.gitignore | 9 + packages/flutter_video_launcher/CHANGELOG.md | 23 ++ packages/flutter_video_launcher/LICENSE | 27 ++ packages/flutter_video_launcher/README.md | 96 ++++++ .../flutter_video_launcher/android/.gitignore | 12 + .../plugins/GeneratedPluginRegistrant.java | 25 ++ .../android/build.gradle | 32 ++ .../android/gradle.properties | 1 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 7 + .../video_launcher/VideoLauncherPlugin.java | 85 +++++ .../flutter_video_launcher/ios/.gitignore | 31 ++ .../ios/Assets/.gitkeep | 0 .../ios/Classes/VideoLauncherPlugin.h | 4 + .../ios/Classes/VideoLauncherPlugin.m | 74 +++++ .../ios/Flutter/Generated.xcconfig | 9 + .../ios/Runner/GeneratedPluginRegistrant.h | 14 + .../ios/Runner/GeneratedPluginRegistrant.m | 14 + .../ios/video_launcher.podspec | 21 ++ .../lib/video_launcher.dart | 27 ++ packages/flutter_video_launcher/pubspec.yaml | 17 + .../flutter_video_launcher/screenshot.png | Bin 0 -> 110388 bytes .../flutter_video_launcher/video_launcher.iml | 16 + pubspec.lock | 39 ++- pubspec.yaml | 6 + 36 files changed, 1174 insertions(+), 140 deletions(-) create mode 100644 lib/models/Settings.dart create mode 100644 packages/flutter_video_launcher/.gitignore create mode 100644 packages/flutter_video_launcher/CHANGELOG.md create mode 100644 packages/flutter_video_launcher/LICENSE create mode 100644 packages/flutter_video_launcher/README.md create mode 100644 packages/flutter_video_launcher/android/.gitignore create mode 100644 packages/flutter_video_launcher/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 packages/flutter_video_launcher/android/build.gradle create mode 100644 packages/flutter_video_launcher/android/gradle.properties create mode 100644 packages/flutter_video_launcher/android/settings.gradle create mode 100644 packages/flutter_video_launcher/android/src/main/AndroidManifest.xml create mode 100644 packages/flutter_video_launcher/android/src/main/java/bz/rxla/video_launcher/VideoLauncherPlugin.java create mode 100644 packages/flutter_video_launcher/ios/.gitignore create mode 100644 packages/flutter_video_launcher/ios/Assets/.gitkeep create mode 100644 packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.h create mode 100644 packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.m create mode 100644 packages/flutter_video_launcher/ios/Flutter/Generated.xcconfig create mode 100644 packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.m create mode 100644 packages/flutter_video_launcher/ios/video_launcher.podspec create mode 100644 packages/flutter_video_launcher/lib/video_launcher.dart create mode 100644 packages/flutter_video_launcher/pubspec.yaml create mode 100755 packages/flutter_video_launcher/screenshot.png create mode 100644 packages/flutter_video_launcher/video_launcher.iml diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 31de08e..953a07c 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -7,6 +7,7 @@ --> + diff --git a/lib/config/application.dart b/lib/config/application.dart index 3fbb01d..f389f65 100644 --- a/lib/config/application.dart +++ b/lib/config/application.dart @@ -9,30 +9,43 @@ import 'package:sqflite/sqflite.dart'; import '../models/Category.dart'; import '../models/CaptureModel.dart'; import '../models/Series.dart'; +import '../models/Settings.dart'; class Application { static Router router; static Database db; static bool _dbIsOpened = false; static String _databaseName = 'cantonfair.db'; - static Map cache; + static Map cache; static String databasePath = ""; static String appDir; + static String mainDir; static String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); static Future backupDatabase() async { await closeDatabase(); File f = new File(join(databasePath, _databaseName)); - String newPath = join(databasePath, '${timestamp()}.db'); + var backup = join(appDir, "Backup"); + String newPath = join(backup, '${timestamp()}.db'); + await Directory(backup).create(recursive: true); print("Coping to $newPath"); await f.copy(newPath); await openDB(); } - static Future initDatabase() async { - Directory extPath = await getExternalStorageDirectory(); - appDir = join(extPath.path, "CantonFair"); + static Future forceDelete() async { + await closeDatabase(); + File f = new File(join(databasePath, _databaseName)); + if (await f.exists()) await f.delete(); + await openDB(); + } + + static Future initDatabase() async { + Directory extDir = await getExternalStorageDirectory(); + mainDir = extDir.path; + appDir = join(mainDir, "CantonFair"); + await Directory(appDir).create(recursive: true); databasePath = join(appDir, "Database"); await openDB(); } @@ -47,15 +60,9 @@ class Application { print("Database opened !"); _dbIsOpened = true; - // only on development - // print("Droping ${Category.tableName} ..."); - // await db.execute("DROP TABLE ${Category.tableName};"); - - // print("Droping ${Series.tableName} ..."); - // await db.execute("DROP TABLE ${Series.tableName};"); - - // print("Droping ${CaptureModel.tableName} ..."); - // await db.execute("DROP TABLE ${CaptureModel.tableName};"); + print("Creating ${Settings.tableName} ..."); + await db.execute(Settings.dbOnCreate); + Settings.db = db; print("Creating ${CaptureModel.tableName} ..."); await db.execute(CaptureModel.dbOnCreate); @@ -71,11 +78,6 @@ class Application { }, onCreate: (Database db, int version) async { // only on production - print("Creating ${Category.tableName} ..."); - await db.execute(Category.dbOnCreate); - - print("Creating ${Series.tableName} ..."); - await db.execute(Series.dbOnCreate); }, ); } diff --git a/lib/models/Series.dart b/lib/models/Series.dart index 2e7731a..2a75f34 100644 --- a/lib/models/Series.dart +++ b/lib/models/Series.dart @@ -77,6 +77,7 @@ class Series { static Future getCategoryOfSeriesUUID(uuid, {inv: 'desc', order: 'created_at'}) async { var series = await getSelectedSeriesByUUID(uuid); + if (series == null) return null; var result = await db.rawQuery( 'SELECT * FROM ${Category.tableName} WHERE ${Category.dbUUID} = "${series.categoryUUID}" ORDER BY "$order $inv";'); List categories = []; diff --git a/lib/models/Settings.dart b/lib/models/Settings.dart new file mode 100644 index 0000000..e67a1e8 --- /dev/null +++ b/lib/models/Settings.dart @@ -0,0 +1,53 @@ +import 'dart:async'; +import 'package:sqflite/sqflite.dart'; + +class Settings { + static Database db; + + static final String dbKey = "key"; + static final String dbValue = "value"; + + static final String tableName = "settings"; + static final String dbOnCreate = "CREATE TABLE IF NOT EXISTS $tableName (" + "${Settings.dbKey} STRING PRIMARY KEY," + "${Settings.dbValue} Text" + ")"; + + String key; + String value; + + Settings({this.key, this.value}); + + Settings.fromMap(Map map) { + this.key = map[dbKey]; + this.value = map[dbValue]; + } + + Map toMap() { + return { + dbValue: value, + dbKey: key, + }; + } + + static Future fetch(String key) async { + var result = await db.rawQuery( + 'SELECT * FROM $tableName WHERE $dbKey = "$key";'); + List items = []; + for (Map item in result) { + items.add(new Settings.fromMap(item)); + } + return items.length > 0 ? items[0] : null; + } + + static Future save(Settings item) async { + await db.rawInsert( + 'INSERT OR REPLACE INTO ' + '$tableName(${Settings.dbKey}, ${Settings.dbValue})' + ' VALUES(?, ?)', + [ + item.key, + item.value, + ]); + } +} diff --git a/lib/pages/capture.dart b/lib/pages/capture.dart index cd135d1..2672f06 100644 --- a/lib/pages/capture.dart +++ b/lib/pages/capture.dart @@ -4,6 +4,7 @@ import 'dart:io'; import 'package:audio_recorder/audio_recorder.dart'; import 'package:camera/camera.dart'; import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; import '../config/application.dart'; import '../models/CaptureModel.dart'; @@ -32,13 +33,22 @@ class Choice { const Choice({this.title, this.icon, this.camera}); } -enum Options { video, videoRecording, photo, audio, audioRecording } +enum Options { + video, + videoRecording, + photo, + audio, + audioRecording, + hqVideo, + hqPhoto, +} class _CaptureRoute extends State { final GlobalKey _scaffoldKey = GlobalKey(); CameraController controller; CaptureModel model; + String openTime; var _state = Options.photo; bool _initializing = false; @@ -47,7 +57,9 @@ class _CaptureRoute extends State { bool _loading = false; final String uuid; - _CaptureRoute({this.uuid}); + _CaptureRoute({this.uuid}) { + openTime = timestamp(); + } @override Widget build(BuildContext context) { @@ -62,13 +74,6 @@ class _CaptureRoute extends State { ); } - @override - void initState() { - print("init state"); - _prepare(); - super.initState(); - } - @override void dispose() { print("capture dispose"); @@ -76,16 +81,18 @@ class _CaptureRoute extends State { this.controller?.dispose(); } + @override + void initState() { + _prepare(); + super.initState(); + } + void onAudioRecordButtonPressed() { - setState(() { - _loading = true; - }); + setState(() => _loading = true); startAudioRecord().then((String filePath) { _state = Options.audioRecording; if (mounted) { - setState(() { - _loading = false; - }); + setState(() => _loading = false); if (filePath != null) { model = CaptureModel( filePath: filePath, @@ -128,29 +135,90 @@ class _CaptureRoute extends State { } } + void onHQTakePhotoButtonPressed() { + setState(() => _loading = true); + hqTakePhoto().then((String filePath) { + if (mounted) { + _state = Options.hqPhoto; + setState(() => _loading = false); + if (filePath != null) { + model = CaptureModel( + filePath: filePath, + seriesUUID: uuid, + captureMode: CaptureMode.picture); + CaptureModel.updateItem(model); + } + setState(() {}); + } + }); + } + + void onHQVideoRecordButtonPressed() { + setState(() => _loading = true); + hqVideoRecord().then((String filePath) { + if (mounted) { + _state = Options.hqVideo; + setState(() => _loading = false); + if (filePath != null) { + model = CaptureModel( + filePath: filePath, + seriesUUID: uuid, + captureMode: CaptureMode.video); + CaptureModel.updateItem(model); + } + setState(() {}); + } + }); + } + + Future hqTakePhoto() async { + var image = await ImagePicker.pickImage(source: ImageSource.camera); + if (image == null) return null; + final String dirPath = + '${Application.appDir}/Categories/${_category.name}/${openTime}_$uuid/Photos'; + await Directory(dirPath).create(recursive: true); + final String filePath = '$dirPath/${timestamp()}.jpg'; + await image.copy(filePath); + await image.delete(); + return filePath; + } + + Future hqVideoRecord() async { + var video = await ImagePicker.pickVideo(source: ImageSource.camera); + if (video == null) return null; + final String dirPath = + '${Application.appDir}/Categories/${_category.name}/${openTime}_$uuid/Movies'; + await Directory(dirPath).create(recursive: true); + final String filePath = '$dirPath/${timestamp()}.mp4'; + await video.copy(filePath); + await video.delete(); + return filePath; + } + void onTakePictureButtonPressed() { - _loading = true; + setState(() => _loading = true); takePicture().then((String filePath) { if (mounted) { - _loading = false; + _state = Options.photo; + setState(() => _loading = false); if (filePath != null) { model = CaptureModel( filePath: filePath, seriesUUID: uuid, captureMode: CaptureMode.picture); CaptureModel.updateItem(model); - } + } setState(() {}); } }); } void onVideoRecordButtonPressed() { - _loading = true; + setState(() => _loading = true); startVideoRecording().then((String filePath) { if (mounted) { _state = Options.videoRecording; - _loading = false; + setState(() => _loading = false); if (filePath != null) { model = CaptureModel( filePath: filePath, @@ -170,9 +238,20 @@ class _CaptureRoute extends State { }); } + void showInSnackBar(String message) { + _scaffoldKey.currentState.showSnackBar( + SnackBar( + content: Text(message), + action: SnackBarAction( + label: 'HIDE', + onPressed: _scaffoldKey.currentState.hideCurrentSnackBar), + ), + ); + } + Future startAudioRecord() async { final String dirPath = - '${Application.appDir}/Categories/${_category.name}/$uuid/Audios'; + '${Application.appDir}/Categories/${_category.name}/${openTime}_$uuid/Audios'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${timestamp()}.aac'; @@ -186,17 +265,6 @@ class _CaptureRoute extends State { return filePath; } - void showInSnackBar(String message) { - _scaffoldKey.currentState.showSnackBar( - SnackBar( - content: Text(message), - action: SnackBarAction( - label: 'HIDE', - onPressed: _scaffoldKey.currentState.hideCurrentSnackBar), - ), - ); - } - Future startVideoRecording() async { if (!controller.value.isInitialized) { showInSnackBar('Error: select a camera first.'); @@ -204,7 +272,7 @@ class _CaptureRoute extends State { } final String dirPath = - '${Application.appDir}/Categories/${_category.name}/$uuid/Movies'; + '${Application.appDir}/Categories/${_category.name}/${openTime}_$uuid/Movies'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${timestamp()}.mp4'; @@ -247,7 +315,7 @@ class _CaptureRoute extends State { return null; } final String dirPath = - '${Application.appDir}/Categories/${_category.name}/$uuid/Pictures'; + '${Application.appDir}/Categories/${_category.name}/${openTime}_$uuid/Pictures'; await Directory(dirPath).create(recursive: true); final String filePath = '$dirPath/${timestamp()}.jpg'; @@ -294,6 +362,18 @@ class _CaptureRoute extends State { Options.audio, ), ), + IconButton( + color: whiteColor, + icon: Icon(Icons.ondemand_video), + onPressed: + _changeIfState(_state == Options.hqVideo, Options.hqVideo), + ), + IconButton( + color: whiteColor, + icon: Icon(Icons.camera_enhance), + onPressed: + _changeIfState(_state == Options.hqPhoto, Options.hqPhoto), + ), ], ), ), @@ -310,7 +390,7 @@ class _CaptureRoute extends State { } Function _captureButtonHandler() { - if (_loading) return null; + if (_loading || _initializing) return null; return () { if (_state == Options.photo) { onTakePictureButtonPressed(); @@ -322,6 +402,10 @@ class _CaptureRoute extends State { onAudioRecordButtonPressed(); } else if (_state == Options.audioRecording) { onAudioStopButtonPressed(); + } else if (_state == Options.hqVideo) { + onHQVideoRecordButtonPressed(); + } else if (_state == Options.hqPhoto) { + onHQTakePhotoButtonPressed(); } }; } @@ -338,15 +422,17 @@ class _CaptureRoute extends State { Widget _floatingButton() { return FloatingActionButton( - backgroundColor: secondaryColor, - foregroundColor: whiteColor, + backgroundColor: + (_state == Options.audioRecording || _state == Options.videoRecording) + ? whiteColor + : secondaryColor, child: _floatingButtonChild(), onPressed: _captureButtonHandler(), ); } Widget _floatingButtonChild() { - if (_loading) { + if (_loading || _initializing) { return Padding( padding: EdgeInsets.all(15.0), child: CircularProgressIndicator( @@ -357,8 +443,8 @@ class _CaptureRoute extends State { if (_state == Options.audioRecording || _state == Options.videoRecording) { return Icon( Icons.stop, - size: 50.0, - color: Colors.black.withRed(50), + size: 35.0, + color: Colors.redAccent, ); } return Icon(Icons.archive); @@ -373,12 +459,16 @@ class _CaptureRoute extends State { } void _prepare() async { - _initializing = true; + setState(() => _initializing = true); + await Future.delayed(Duration(milliseconds: 250)); _category = await Series.getCategoryOfSeriesUUID(uuid); + if (_category == null) { + showInSnackBar("Category not found !"); + return; + } await onNewCameraSelected(choices[0].camera); - await Future.delayed(Duration(milliseconds: 500)); - _initializing = false; - setState(() {}); + await Future.delayed(Duration(milliseconds: 250)); + setState(() => _initializing = false); } void _showCameraException(CameraException e) { diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 69fc36f..b10153c 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -204,6 +204,9 @@ class _HomeRoute extends State { ), ), ListTile( + onLongPress: () { + Application.router.navigateTo(context, '/categories'); + }, title: Text("Category"), leading: Icon(Icons.list), subtitle: diff --git a/lib/pages/item-view.dart b/lib/pages/item-view.dart index 23a2d1e..1e32957 100644 --- a/lib/pages/item-view.dart +++ b/lib/pages/item-view.dart @@ -1,5 +1,11 @@ +import 'dart:io'; +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_swiper/flutter_swiper.dart'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:video_player/video_player.dart'; +import 'package:video_launcher/video_launcher.dart'; import '../utils/ui.dart'; import '../models/CaptureModel.dart'; @@ -20,9 +26,17 @@ class _ItemViewRouteRoute extends State { int index; String tag; SwiperController controller = new SwiperController(); + AudioPlayer audioPlayer = new AudioPlayer(); + VideoPlayerController videoController; _ItemViewRouteRoute({this.tag, this.list, this.index}); + @override + void dispose() { + super.dispose(); + videoController?.dispose(); + } + @override Widget build(BuildContext context) { return Hero( @@ -31,6 +45,13 @@ class _ItemViewRouteRoute extends State { body: Container( child: Swiper( onIndexChanged: (current) { + audioPlayer?.stop(); + if (videoController != null) { + if (videoController.value.isPlaying) { + videoController?.seekTo(Duration(seconds: 0)); + videoController?.pause(); + } + } setState(() { tag = list[current].uuid; index = current; @@ -38,7 +59,8 @@ class _ItemViewRouteRoute extends State { }, controller: controller, pagination: new SwiperPagination( - margin: new EdgeInsets.all(5.0), + alignment: Alignment.topCenter, + margin: new EdgeInsets.all(35.0), ), control: new SwiperControl( color: whiteColor, @@ -46,17 +68,12 @@ class _ItemViewRouteRoute extends State { index: index, itemBuilder: (BuildContext context, int index) { CaptureMode type = list[index].captureMode; - if (type == CaptureMode.video) return Container(); - if (type == CaptureMode.audio) return Container(); + if (type == CaptureMode.video) + return VideoPlayerWidget(videoController, list[index].filePath); + if (type == CaptureMode.audio) + return AudioPlayerWidget(audioPlayer, list[index].filePath); if (type == CaptureMode.picture) - return Container( - decoration: BoxDecoration( - color: Colors.black.withOpacity(0.5), - image: DecorationImage( - image: AssetImage(list[index].filePath), - fit: BoxFit.cover, - )), - ); + return ImageViewWidget(list[index].filePath); }, itemCount: list.length, ), @@ -70,3 +87,278 @@ class _ItemViewRouteRoute extends State { super.initState(); } } + +class ImageViewWidget extends StatelessWidget { + final String filePath; + ImageViewWidget(this.filePath); + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + new Expanded( + child: new Container( + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.5), + image: DecorationImage( + image: AssetImage(filePath), + fit: BoxFit.cover, + ), + ), + ), + ), + new Container( + color: primaryColor, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FlatButton( + child: Text("Image Viewer", style: TextStyle(color: whiteColor)), + onPressed: null, + ), + ], + ), + ), + ], + ), + ); + } +} + +class VideoPlayerWidget extends StatefulWidget { + final String filePath; + final VideoPlayerController controller; + VideoPlayerWidget(this.controller, this.filePath); + + @override + _VideoPlayerWidget createState() => + new _VideoPlayerWidget(this.controller, this.filePath); +} + +class _VideoPlayerWidget extends State { + VideoPlayerController controller; + final String filePath; + bool _isPlaying = false; + _VideoPlayerWidget(this.controller, this.filePath); + + @override + void initState() { + super.initState(); + controller = VideoPlayerController.file(File(filePath)) + ..addListener(() { + final bool isPlaying = controller.value.isPlaying; + if (isPlaying != _isPlaying) { + if (mounted) + setState(() { + _isPlaying = isPlaying; + }); + } + }) + ..initialize().then((_) { + if (mounted) setState(() {}); + }); + } + + Future _launchVideo(path) async { + if (await canLaunchVideo(path, isLocal: true)) { + await launchVideo(path, isLocal: true); + return true; + } + return false; + } + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + new Expanded( + child: controller.value.initialized + ? Center( + child: Align( + child: VideoPlayer(controller), + ), + ) + : Container( + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.5), + image: DecorationImage( + image: AssetImage("assets/purple-materials.jpg"), + fit: BoxFit.cover, + ), + ), + ), + ), + new Container( + color: primaryColor, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FlatButton( + child: Icon( + controller.value.isPlaying + ? Icons.pause + : Icons.play_arrow, + color: whiteColor), + onPressed: () { + if (controller.value.isPlaying) + controller.pause(); + else + controller.play(); + }, + ), + FlatButton( + child: Icon(Icons.stop, color: whiteColor), + onPressed: () { + if (controller.value.isPlaying) { + controller.seekTo(Duration(seconds: 0)); + controller.pause(); + } + }, + ), + FlatButton( + child: Icon(Icons.open_with, color: whiteColor), + onPressed: () { + _launchVideo(filePath).then((result) { + print("Error on launch video !"); + }); + }, + ), + ], + ), + ), + ], + ), + ); + } +} + +class AudioPlayerWidget extends StatefulWidget { + final String filePath; + final AudioPlayer player; + AudioPlayerWidget(this.player, this.filePath); + + @override + _AudioPlayerWidget createState() => + new _AudioPlayerWidget(this.player, this.filePath); +} + +class _AudioPlayerWidget extends State { + final String filePath; + _AudioPlayerWidget(this.audioPlayer, this.filePath); + int state = 0; + AudioPlayer audioPlayer; + Duration duration = Duration(seconds: 0), position = Duration(seconds: 0); + + Function _playHandler() { + if (state == 0) { + return () { + audioPlayer.play(filePath, isLocal: true).then((result) { + setState(() { + state = 1; + }); + }); + }; + } + if (state == 2) { + return () { + audioPlayer.resume().then((result) { + setState(() { + state = 1; + }); + }); + }; + } + return null; + } + + Function _stopHandler() { + if (state != 0) { + return () { + audioPlayer.stop().then((result) { + setState(() { + state = 0; + duration = Duration(seconds: 0); + position = Duration(seconds: 0); + }); + }); + }; + } + return null; + } + + Function _pauseHandler() { + if (state == 1) { + return () { + audioPlayer.pause().then((result) { + setState(() { + state = 2; + }); + }); + }; + } + return null; + } + + @override + void initState() { + super.initState(); + audioPlayer.positionHandler = (Duration p) { + setState(() => position = p); + }; + audioPlayer.durationHandler = (Duration d) { + setState(() => duration = d); + }; + audioPlayer.completionHandler = () { + setState(() { + state = 0; + position = duration; + }); + }; + } + + @override + Widget build(BuildContext context) { + return Container( + child: Column( + children: [ + new Expanded( + child: new Container( + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.5), + image: DecorationImage( + image: AssetImage("assets/purple-materials.jpg"), + fit: BoxFit.cover, + ), + ), + ), + ), + new LinearProgressIndicator( + value: (position.inSeconds / (duration.inSeconds * 1.0)), + ), + new Container( + color: primaryColor, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + FlatButton( + child: Icon(Icons.play_arrow, color: whiteColor), + onPressed: _playHandler(), + ), + FlatButton( + child: Icon(Icons.pause, color: whiteColor), + onPressed: _pauseHandler(), + ), + FlatButton( + child: Icon(Icons.stop, color: whiteColor), + onPressed: _stopHandler(), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/selected-series.dart b/lib/pages/selected-series.dart index 28e681f..6486f89 100644 --- a/lib/pages/selected-series.dart +++ b/lib/pages/selected-series.dart @@ -153,6 +153,11 @@ class _SelectedSeriesRoute extends State subtitle: Text(_makeTitle(_selectedSeries.description)), leading: Icon(Icons.description), ), + ListTile( + title: Text("UUID:"), + subtitle: Text(_selectedSeries.uuid), + leading: Icon(Icons.code), + ), ListTile( title: Text("Created at:"), subtitle: Text(formatter.format(_selectedSeries.createdAt)), @@ -231,6 +236,17 @@ class _SelectedSeriesRoute extends State title: Text( _makeTitle(_selectedSeries.title), ), + // actions: [ + // FlatButton( + // child: Text( + // "Open as", + // style: TextStyle( + // color: whiteColor, + // ), + // ), + // onPressed: _openIntent, + // ) + // ], ), body: _items.length > 0 ? _tabBarView() : _listView(), bottomNavigationBar: _items.length > 0 ? _bottomBar() : null, diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index df75799..260b296 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,8 +1,13 @@ +import 'dart:io'; +import 'package:archive/archive_io.dart'; +import 'dart:async'; import 'package:flutter/material.dart'; import '../utils/ui.dart'; import '../config/application.dart'; +String timestamp() => DateTime.now().millisecondsSinceEpoch.toString(); + class SettingsRoute extends StatefulWidget { @override _SettingsRoute createState() => new _SettingsRoute(); @@ -34,26 +39,46 @@ class _SettingsRoute extends State { ? _showLoading() : ListView( children: [ - // ListTile( - // title: Text("Clear database"), - // leading: Icon(Icons.storage), - // onTap: () { - // confirmDialog(context, "Are you sure ?", () {}); - // }, - // ), + ListTile( + title: Text("Backup from contents"), + leading: Icon(Icons.archive), + onTap: () { + confirmDialog(context, + "This may take long, do you want to continue ?", () { + setState(() => _loading = true); + Future.delayed(Duration(seconds: 1)).then((_) { + var encoder = new ZipFileEncoder(); + encoder.create( + '${Application.mainDir}/CantonFair_${timestamp()}.zip'); + encoder.addDirectory(new Directory(Application.appDir)); + encoder.close(); + setState(() => _loading = false); + }); + }); + }, + ), + Divider(), + ListTile( + title: Text("Clear database"), + leading: Icon(Icons.storage), + onTap: () { + confirmDialog(context, "Are you sure ?", () { + setState(() => _loading = true); + Application.forceDelete().then((_) { + Navigator.pushReplacementNamed(context, "/"); + }); + }); + }, + ), ListTile( title: Text("Backup from database"), leading: Icon(Icons.backup), onTap: () { confirmDialog( context, "Do you want to backup your database ?", () { - setState(() { - _loading = true; - }); + setState(() => _loading = true); Application.backupDatabase().then((_) { - setState(() { - _loading = false; - }); + setState(() => _loading = false); }); }); }, diff --git a/lib/pages/splash-screen.dart b/lib/pages/splash-screen.dart index aea75f5..8b2986a 100644 --- a/lib/pages/splash-screen.dart +++ b/lib/pages/splash-screen.dart @@ -72,11 +72,16 @@ class _SplashScreenRoute extends State { Future requestPermissions() async { final writeAccess = await SimplePermissions.requestPermission( Permission.WriteExternalStorage); + final readAccess = await SimplePermissions.requestPermission( + Permission.ReadExternalStorage); final cameraAccess = await SimplePermissions.requestPermission(Permission.Camera); final recordAudio = await SimplePermissions.requestPermission(Permission.RecordAudio); + if (readAccess != PermissionStatus.authorized) { + return false; + } if (writeAccess != PermissionStatus.authorized) { return false; } @@ -93,7 +98,6 @@ class _SplashScreenRoute extends State { @override void initState() { super.initState(); - requestPermissions().then((ok) { if (ok) { _handleStart(); @@ -104,7 +108,7 @@ class _SplashScreenRoute extends State { } _handleStart() { - Application.cache = new Map(); + Application.cache = new Map(); try { availableCameras().then((cameras) { @@ -119,10 +123,12 @@ class _SplashScreenRoute extends State { ); } - Application.closeDatabase().then((result) { - Application.initDatabase().then((data) { - Category.getCategories().then((categories) { - Application.cache["categories"] = categories; + Application.closeDatabase().then((_) { + Application.initDatabase().then((_) { + Future.wait([ + Category.getCategories(), + ]).then((results) { + Application.cache["categories"] = results[0]; _startApp(); }); }); diff --git a/lib/utils/card.dart b/lib/utils/card.dart index dde40e0..4f82a59 100644 --- a/lib/utils/card.dart +++ b/lib/utils/card.dart @@ -1,6 +1,4 @@ -import 'dart:io'; import 'package:flutter/painting.dart'; -import 'package:video_player/video_player.dart'; import 'package:flutter/material.dart'; import '../models/CaptureModel.dart'; @@ -123,36 +121,13 @@ class _VideoAppCardState extends State { this.loadingImage = loadingImage; } - void dispose() { - print("video dispose !"); - super.dispose(); - } - - VideoPlayerController _controller; - bool _isPlaying = false; - @override - void initState() { - super.initState(); - _controller = VideoPlayerController.file( - File(filepath), - ) - ..addListener(() { - final bool isPlaying = _controller.value.isPlaying; - if (isPlaying != _isPlaying) { - setState(() { - _isPlaying = isPlaying; - }); - } - }) - ..initialize().then((_) { - setState(() {}); - }); - } - - Widget _loading() { + Widget build(BuildContext context) { + print("Building video card ..."); return Container( + child: _overlay(context, CaptureMode.video), decoration: new BoxDecoration( + color: Colors.black.withOpacity(0.5), image: new DecorationImage( image: new AssetImage(loadingImage), fit: BoxFit.cover, @@ -160,20 +135,4 @@ class _VideoAppCardState extends State { ), ); } - - Widget _player() { - // FUCCKK THISS SHITT ! - // flutter has long way to become a perfect mobile framework - // cause of texture does not support border radius - return Container( - color: Colors.black.withOpacity(0.5), - child: VideoPlayer(_controller), - ); - } - - @override - Widget build(BuildContext context) { - print("Building video card ..."); - return _controller.value.initialized ? _player() : _loading(); - } } diff --git a/packages/flutter_video_launcher/.gitignore b/packages/flutter_video_launcher/.gitignore new file mode 100644 index 0000000..14c7d4c --- /dev/null +++ b/packages/flutter_video_launcher/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.atom/ +.idea +.packages +.pub/ +build/ +ios/.generated/ +packages +pubspec.lock diff --git a/packages/flutter_video_launcher/CHANGELOG.md b/packages/flutter_video_launcher/CHANGELOG.md new file mode 100644 index 0000000..2aeee0f --- /dev/null +++ b/packages/flutter_video_launcher/CHANGELOG.md @@ -0,0 +1,23 @@ +# Changelog + +## 0.3.0 + +- fix the local video playing on android +- fix the example + +## 0.2.2 + +- changed Flutter dependency in pubspec.yaml to an SDK dependency + +## 0.2.1 + +- fix the iOS local playing +- add download/play local in the example + +## 0.2.0 + +- android + +## 0.1.0 + +- iOS \ No newline at end of file diff --git a/packages/flutter_video_launcher/LICENSE b/packages/flutter_video_launcher/LICENSE new file mode 100644 index 0000000..86928f6 --- /dev/null +++ b/packages/flutter_video_launcher/LICENSE @@ -0,0 +1,27 @@ +// Copyright 2017 Your Company. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Your Company nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/flutter_video_launcher/README.md b/packages/flutter_video_launcher/README.md new file mode 100644 index 0000000..0f687b9 --- /dev/null +++ b/packages/flutter_video_launcher/README.md @@ -0,0 +1,96 @@ +# VideoLauncher + +## Example + +```bash +cd flutter_video_launcher/example +flutter packages get +flutter run +``` + +![screenshot](https://github.com/rxlabz/flutter_video_launcher/blob/master/screenshot.png) + +## Usage + +To use this plugin, add video_launcher as a dependency in your pubspec.yaml file. + +After importing 'package:video_launcher/video_launcher.dart' the directories can be queried as follows + +## Remote video + +To launch a video : + +```dart +Future _launch(String url) async { + if (await canLaunchVideo(url)) { + await launchVideo(url); + } else { + throw 'Could not launch $url'; + } + } +``` + +## Local video + +To play a local video file : + +```dart +Future _launch(String url) async { + if (await canLaunchVideo(url, isLocal:true)) { + await launchVideo(url, isLocal:true); + } else { + throw 'Could not launch $url'; + } + } +``` + +## Embedded asset + +To play video embedded assets, you can copy them to the app storage folder, and the play them "locally" + +```dart +void _loadOrLaunchLocalAsset() => + localAssetPath != null ? _launchLocalAsset() : copyLocalAsset(); + +Future copyLocalAsset() async { + final dir = await getApplicationDocumentsDirectory(); + final file = new File("${dir.path}/video_asset.mp4"); + final videoData = await rootBundle.load("assets/video.mp4"); + final bytes = videoData.buffer.asUint8List(); + file.writeAsBytes(bytes, flush: true); + setState(() { + localAssetPath = file.path; + _launchLocalAsset(); +}); +} + +void _launchLocalAsset() => + setState(() => _launched = _launchVideo(localAssetPath, isLocal: true)); +``` + +Please see the example app of this plugin for a full example. + + +## :warning: iOS App Transport Security + +By default iOS forbids loading from non-https url. To cancel this restriction edit your .plist and add : + +```xml +NSAppTransportSecurity + + NSAllowsArbitraryLoads + + +``` + +cf. [Configuring App Transport Security Exceptions in iOS](https://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/) + +## Troubleshooting + +If you get a MissingPluginException, try to `flutter build apk` on Android, or `flutter build ios` + +## Getting Started + +For help getting started with Flutter, view our online +[documentation](http://flutter.io/). + \ No newline at end of file diff --git a/packages/flutter_video_launcher/android/.gitignore b/packages/flutter_video_launcher/android/.gitignore new file mode 100644 index 0000000..5c4ef82 --- /dev/null +++ b/packages/flutter_video_launcher/android/.gitignore @@ -0,0 +1,12 @@ +*.iml +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures + +/gradle +/gradlew +/gradlew.bat diff --git a/packages/flutter_video_launcher/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/packages/flutter_video_launcher/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..00c52dd --- /dev/null +++ b/packages/flutter_video_launcher/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,25 @@ +package io.flutter.plugins; + +import io.flutter.plugin.common.PluginRegistry; +import bz.rxla.video_launcher.VideoLauncherPlugin; + +/** + * Generated file. Do not edit. + */ +public final class GeneratedPluginRegistrant { + public static void registerWith(PluginRegistry registry) { + if (alreadyRegisteredWith(registry)) { + return; + } + VideoLauncherPlugin.registerWith(registry.registrarFor("bz.rxla.video_launcher.VideoLauncherPlugin")); + } + + private static boolean alreadyRegisteredWith(PluginRegistry registry) { + final String key = GeneratedPluginRegistrant.class.getCanonicalName(); + if (registry.hasPlugin(key)) { + return true; + } + registry.registrarFor(key); + return false; + } +} diff --git a/packages/flutter_video_launcher/android/build.gradle b/packages/flutter_video_launcher/android/build.gradle new file mode 100644 index 0000000..f39be84 --- /dev/null +++ b/packages/flutter_video_launcher/android/build.gradle @@ -0,0 +1,32 @@ +group 'bz.rxla.video_launcher' +version '1.0-SNAPSHOT' + +buildscript { + repositories { + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:2.3.0' + } +} + +allprojects { + repositories { + jcenter() + } +} + +apply plugin: 'com.android.library' + +android { + compileSdkVersion 25 + buildToolsVersion '25.0.3' + + defaultConfig { + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + lintOptions { + disable 'InvalidPackage' + } +} diff --git a/packages/flutter_video_launcher/android/gradle.properties b/packages/flutter_video_launcher/android/gradle.properties new file mode 100644 index 0000000..8bd86f6 --- /dev/null +++ b/packages/flutter_video_launcher/android/gradle.properties @@ -0,0 +1 @@ +org.gradle.jvmargs=-Xmx1536M diff --git a/packages/flutter_video_launcher/android/settings.gradle b/packages/flutter_video_launcher/android/settings.gradle new file mode 100644 index 0000000..1305243 --- /dev/null +++ b/packages/flutter_video_launcher/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'video_launcher' diff --git a/packages/flutter_video_launcher/android/src/main/AndroidManifest.xml b/packages/flutter_video_launcher/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..02d94d5 --- /dev/null +++ b/packages/flutter_video_launcher/android/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/packages/flutter_video_launcher/android/src/main/java/bz/rxla/video_launcher/VideoLauncherPlugin.java b/packages/flutter_video_launcher/android/src/main/java/bz/rxla/video_launcher/VideoLauncherPlugin.java new file mode 100644 index 0000000..3fdf6ba --- /dev/null +++ b/packages/flutter_video_launcher/android/src/main/java/bz/rxla/video_launcher/VideoLauncherPlugin.java @@ -0,0 +1,85 @@ +package bz.rxla.video_launcher; + +import android.app.Activity; +import android.content.ComponentName; +import android.content.Intent; +import android.net.Uri; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.PluginRegistry; + +import java.io.File; +import java.util.HashMap; + + +/** + * VideoLauncherPlugin + */ +public class VideoLauncherPlugin implements MethodChannel.MethodCallHandler { + private final Activity activity; + + public static void registerWith(PluginRegistry.Registrar registrar) { + MethodChannel channel = + new MethodChannel(registrar.messenger(), "bz.rxla.flutter/video_launcher"); + VideoLauncherPlugin instance = new VideoLauncherPlugin(registrar.activity()); + channel.setMethodCallHandler(instance); + } + + private VideoLauncherPlugin(Activity activity) { + this.activity = activity; + } + + @Override + public void onMethodCall(MethodCall call, MethodChannel.Result result) { + String url = ((HashMap) call.arguments()).get("url").toString(); + Boolean isLocal = ((HashMap) call.arguments()).get("isLocal").toString() == "1"; + if (call.method.equals("canLaunchVideo")) { + canLaunchVideo(url, result, isLocal); + } else if (call.method.equals("launchVideo")) { + launchURLVideo(url, result, isLocal); + } else { + result.notImplemented(); + } + } + + private void launchURLVideo(String url, MethodChannel.Result result, Boolean isLocal) { + if( isLocal ){ + File f = new File(url); + f.setReadable(true, false); + Uri videoUri = Uri.fromFile(f); + Intent launchIntent = new Intent(Intent.ACTION_VIEW); + launchIntent.setDataAndType(Uri.parse(videoUri.toString()), "video/mp4"); + activity.startActivity(launchIntent); + result.success(null); + } else { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + intent.setDataAndType(Uri.parse(url), "video/mp4"); + activity.startActivity(intent); + result.success(null); + } + } + + private void canLaunchVideo(String url, MethodChannel.Result result, Boolean isLocal) { + boolean canLaunch; + + if (isLocal) { + File f = new File(url); + f.setReadable(true, false); + Uri videoUri = Uri.fromFile(f); + Intent launchIntent = new Intent(Intent.ACTION_VIEW); + launchIntent.setDataAndType(Uri.parse(videoUri.toString()), "video/mp4"); + ComponentName componentName = launchIntent.resolveActivity(activity.getPackageManager()); + canLaunch = componentName != null + && !"{com.android.fallback/com.android.fallback.Fallback}" + .equals(componentName.toShortString()); + } else { + Intent launchIntent = new Intent(Intent.ACTION_VIEW); + launchIntent.setDataAndType(Uri.parse(url), "video/mp4"); + ComponentName componentName = launchIntent.resolveActivity(activity.getPackageManager()); + canLaunch = componentName != null + && !"{com.android.fallback/com.android.fallback.Fallback}" + .equals(componentName.toShortString()); + } + result.success(canLaunch); + } +} diff --git a/packages/flutter_video_launcher/ios/.gitignore b/packages/flutter_video_launcher/ios/.gitignore new file mode 100644 index 0000000..956c87f --- /dev/null +++ b/packages/flutter_video_launcher/ios/.gitignore @@ -0,0 +1,31 @@ +.idea/ +.vagrant/ +.sconsign.dblite +.svn/ + +.DS_Store +*.swp +profile + +DerivedData/ +build/ + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 + +!default.pbxuser +!default.mode1v3 +!default.mode2v3 +!default.perspectivev3 + +xcuserdata + +*.moved-aside + +*.pyc +*sync/ +Icon? +.tags* + diff --git a/packages/flutter_video_launcher/ios/Assets/.gitkeep b/packages/flutter_video_launcher/ios/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.h b/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.h new file mode 100644 index 0000000..a25746c --- /dev/null +++ b/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.h @@ -0,0 +1,4 @@ +#import + +@interface VideoLauncherPlugin : NSObject +@end diff --git a/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.m b/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.m new file mode 100644 index 0000000..ad1e59a --- /dev/null +++ b/packages/flutter_video_launcher/ios/Classes/VideoLauncherPlugin.m @@ -0,0 +1,74 @@ +#import "VideoLauncherPlugin.h" +#import +#import + +@implementation VideoLauncherPlugin + ++ (void)registerWithRegistrar:(NSObject *)registrar { + FlutterMethodChannel *channel = + [FlutterMethodChannel methodChannelWithName:@"bz.rxla.flutter/video_launcher" + binaryMessenger:registrar.messenger]; + [channel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) { + NSString *url = call.arguments[@"url"]; + BOOL isLocal = call.arguments[@"isLocal"] == @1; + + if ([@"canLaunchVideo" isEqualToString:call.method]) { + result(isLocal ? @([self fileExists:url]) : @([self canLaunchURLVideo:url])); + } else if ([@"launchVideo" isEqualToString:call.method]) { + [self launchURLVideo:url result:result isLocal:isLocal]; + } else { + result(FlutterMethodNotImplemented); + } + }]; +} + ++ (BOOL)fileExists:(NSString *)pathString { + NSFileManager *fileManager = [NSFileManager defaultManager]; + return [fileManager fileExistsAtPath:pathString]; +} + ++ (BOOL)canLaunchURLVideo:(NSString *)urlString { + NSURL *url = [NSURL URLWithString:urlString]; + UIApplication *application = [UIApplication sharedApplication]; + return [application canOpenURL:url]; +} + ++ (void)launchURLVideo:(NSString *)urlString result:(FlutterResult)result isLocal:(BOOL)isLocal { + NSURL *url = isLocal ? [NSURL fileURLWithPath:urlString] : [NSURL URLWithString:urlString]; + + AVPlayer *player = [AVPlayer playerWithURL:url]; + + AVPlayerViewController *playerViewController = [AVPlayerViewController new]; + playerViewController.showsPlaybackControls = YES; + playerViewController.player = player; + + UIViewController *viewController = [UIApplication sharedApplication].keyWindow.rootViewController; + [viewController.view addSubview:playerViewController.view]; + [viewController presentViewController:playerViewController animated:YES completion:nil]; + + [player play]; + +// Using ifdef as workaround to support running with Xcode 7.0 and sdk version 9 +// where the dynamic check fails. +#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_9_0 + [application openURL:url + options:@{} + completionHandler:^(BOOL success) { + [self sendResult:success result:result url:url]; + }]; +#else + [self sendResult:YES result:result url:url]; +#endif +} + ++ (void)sendResult:(BOOL)success result:(FlutterResult)result url:(NSURL *)url { + if (success) { + result(nil); + } else { + result([FlutterError errorWithCode:@"Error" + message:[NSString stringWithFormat:@"Error while launching %@", url] + details:nil]); + } +} + +@end diff --git a/packages/flutter_video_launcher/ios/Flutter/Generated.xcconfig b/packages/flutter_video_launcher/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..f5aa7a3 --- /dev/null +++ b/packages/flutter_video_launcher/ios/Flutter/Generated.xcconfig @@ -0,0 +1,9 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/home/aiden/flutter/flutter +FLUTTER_APPLICATION_PATH=/home/aiden/flutter/projects/cantonfair/packages/flutter_video_launcher +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_MODE=debug +FLUTTER_BUILD_DIR=build +SYMROOT=${SOURCE_ROOT}/../build/ios +FLUTTER_FRAMEWORK_DIR=/home/aiden/flutter/flutter/bin/cache/artifacts/engine/ios +FLUTTER_BUILD_NAME=0.3.0 diff --git a/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.h b/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..3b700eb --- /dev/null +++ b/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +#endif /* GeneratedPluginRegistrant_h */ diff --git a/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.m b/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..9fde087 --- /dev/null +++ b/packages/flutter_video_launcher/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,14 @@ +// +// Generated file. Do not edit. +// + +#import "GeneratedPluginRegistrant.h" +#import + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { + [VideoLauncherPlugin registerWithRegistrar:[registry registrarForPlugin:@"VideoLauncherPlugin"]]; +} + +@end diff --git a/packages/flutter_video_launcher/ios/video_launcher.podspec b/packages/flutter_video_launcher/ios/video_launcher.podspec new file mode 100644 index 0000000..6e11ba7 --- /dev/null +++ b/packages/flutter_video_launcher/ios/video_launcher.podspec @@ -0,0 +1,21 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'video_launcher' + s.version = '0.0.1' + s.summary = 'A new flutter plugin project.' + s.description = <<-DESC +A new flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' +end + diff --git a/packages/flutter_video_launcher/lib/video_launcher.dart b/packages/flutter_video_launcher/lib/video_launcher.dart new file mode 100644 index 0000000..80870f3 --- /dev/null +++ b/packages/flutter_video_launcher/lib/video_launcher.dart @@ -0,0 +1,27 @@ +import 'dart:async'; + +import 'package:flutter/services.dart'; + +const _channel = const MethodChannel('bz.rxla.flutter/video_launcher'); + +/// Parses the specified video URL string and delegates handling of it to the +/// underlying platform. +/// +/// The returned future completes with a [PlatformException] on invalid URLs and +/// schemes which cannot be handled, that is when [canLaunchVideo] would complete +/// with false. +Future launchVideo(String urlString, {bool isLocal:false}) { + return _channel.invokeMethod( + /* FIXME had some trouble to send a false BOOL to objC => for now I send 1 || 0 */ + 'launchVideo',{"url":urlString, "isLocal":isLocal ? 1 : 0 }, + ); +} + +/// Checks whether the specified video URL can be handled by some app installed on the +/// device. +Future canLaunchVideo(String urlString, {bool isLocal:false}) async { + if (urlString == null) return false; + return await _channel.invokeMethod( + 'canLaunchVideo',{"url":urlString, "isLocal":isLocal ? 1 : 0} + ); +} diff --git a/packages/flutter_video_launcher/pubspec.yaml b/packages/flutter_video_launcher/pubspec.yaml new file mode 100644 index 0000000..d8cdd3b --- /dev/null +++ b/packages/flutter_video_launcher/pubspec.yaml @@ -0,0 +1,17 @@ +name: video_launcher +description: Fullscreen video launcher plugin +version: 0.3.0 +author: Erick Ghaumez +homepage: https://github.com/rxlabz/flutter_video_launcher + +flutter: + plugin: + androidPackage: bz.rxla.video_launcher + pluginClass: VideoLauncherPlugin + +dependencies: + flutter: + sdk: flutter + +environment: + sdk: ">=2.0.0 <2.2.0" diff --git a/packages/flutter_video_launcher/screenshot.png b/packages/flutter_video_launcher/screenshot.png new file mode 100755 index 0000000000000000000000000000000000000000..ab414703ca988572a2679bebef02e66d3156681a GIT binary patch literal 110388 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 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 9bde5d5..213f31a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -8,8 +8,15 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.32.4" + android_intent: + dependency: "direct main" + description: + name: android_intent + url: "https://pub.dartlang.org" + source: hosted + version: "0.2.1" archive: - dependency: transitive + dependency: "direct main" description: name: archive url: "https://pub.dartlang.org" @@ -36,6 +43,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.0.6" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.8" boolean_selector: dependency: transitive description: @@ -186,6 +200,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.4" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.4.10" intl: dependency: "direct main" description: @@ -298,6 +319,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.2" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.0" plugin: dependency: transitive description: @@ -471,6 +499,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.0.8" + video_launcher: + dependency: "direct main" + description: + path: "packages/flutter_video_launcher" + relative: true + source: path + version: "0.3.0" video_player: dependency: "direct main" description: @@ -514,5 +549,5 @@ packages: source: hosted version: "2.1.15" sdks: - dart: ">=2.0.0 <3.0.0" + dart: ">=2.0.0 <2.2.0" flutter: ">=0.2.5 <2.0.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8413f5e..752eeaa 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,6 +18,7 @@ dependencies: cupertino_icons: ^0.1.2 camera: 0.2.4 + android_intent: 0.2.1 path_provider: ^0.4.1 sqflite: any fluro: "^1.3.4" @@ -29,6 +30,11 @@ dependencies: image: any video_player: "0.6.5" flutter_swiper: any + audioplayers: 0.7.8 + archive: 2.0.4 + image_picker: 0.4.10 + video_launcher: + path: './packages/flutter_video_launcher' dev_dependencies: flutter_test: