diff --git a/assets/videos/intro_1.mp4 b/assets/videos/intro_1.mp4 new file mode 100644 index 0000000..d4e82b4 Binary files /dev/null and b/assets/videos/intro_1.mp4 differ diff --git a/assets/videos/intro_2.mp4 b/assets/videos/intro_2.mp4 new file mode 100644 index 0000000..37676a5 Binary files /dev/null and b/assets/videos/intro_2.mp4 differ diff --git a/assets/videos/intro_3.mp4 b/assets/videos/intro_3.mp4 new file mode 100644 index 0000000..56f10d9 Binary files /dev/null and b/assets/videos/intro_3.mp4 differ diff --git a/assets/videos/intro_4.mp4 b/assets/videos/intro_4.mp4 new file mode 100644 index 0000000..1b7df80 Binary files /dev/null and b/assets/videos/intro_4.mp4 differ diff --git a/assets/videos/intro_5.mp4 b/assets/videos/intro_5.mp4 new file mode 100644 index 0000000..c456f63 Binary files /dev/null and b/assets/videos/intro_5.mp4 differ diff --git a/lib/features/intro/presentation/bloc/intro_bloc.dart b/lib/features/intro/presentation/bloc/intro_bloc.dart index dbc5205..b863df4 100644 --- a/lib/features/intro/presentation/bloc/intro_bloc.dart +++ b/lib/features/intro/presentation/bloc/intro_bloc.dart @@ -14,11 +14,24 @@ import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_2 import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_3_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_4_screen.dart'; import 'package:hadi_hoda_flutter/features/intro/presentation/ui/screens/intro_5_screen.dart'; +import 'package:pod_player/pod_player.dart'; class IntroBloc extends Bloc { /// ------------constructor------------ - IntroBloc() : super(const IntroState()){ - on(_changeIntroEvent); + IntroBloc() : super(const IntroState()) { + initVideos(); + on(_initVideosEvent); + on(_changeVideosEvent); + } + + @override + Future close() { + podController1.dispose(); + podController2.dispose(); + podController3.dispose(); + podController4.dispose(); + podController5.dispose(); + return super.close(); } /// ------------UseCases------------ @@ -33,6 +46,21 @@ class IntroBloc extends Bloc { ]; /// ------------Controllers------------ + final PodPlayerController podController1 = PodPlayerController( + playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_1.mp4'), + ); + final PodPlayerController podController2 = PodPlayerController( + playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_2.mp4'), + ); + final PodPlayerController podController3 = PodPlayerController( + playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_3.mp4'), + ); + final PodPlayerController podController4 = PodPlayerController( + playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_4.mp4'), + ); + final PodPlayerController podController5 = PodPlayerController( + playVideoFrom: PlayVideoFrom.asset('assets/videos/intro_5.mp4'), + ); /// ------------Functions------------ Future goToHomePage() async { @@ -43,11 +71,46 @@ class IntroBloc extends Bloc { } /// ------------Api Calls------------ - FutureOr _changeIntroEvent(ChangeIntroEvent event, Emitter emit) async { - if (state.currentIntro < intros.length - 1) { - emit(state.copyWith(currentIntro: state.currentIntro + 1)); - } else { - goToHomePage(); + FutureOr _changeVideosEvent(ChangeVideosEvent event, Emitter emit) async { + switch (state.currentIntro) { + case 0: + podController2.play(); + emit(state.copyWith(currentIntro: 1)); + break; + case 1: + podController3.play(); + emit(state.copyWith(currentIntro: 2)); + break; + case 2: + podController4.play(); + emit(state.copyWith(currentIntro: 3)); + break; + case 3: + podController5.play(); + emit(state.copyWith(currentIntro: 4)); + break; + case 4: + goToHomePage(); + break; } } + + Future initVideos() async { + await Future.wait([ + podController1.initialise(), + podController2.initialise(), + podController3.initialise(), + podController4.initialise(), + podController5.initialise(), + ]); + podController1.play(); + add(InitVideosEvent()); + } + + FutureOr _initVideosEvent( + InitVideosEvent event, + Emitter emit, + ) async { + emit(state.copyWith(currentIntro: 0)); + } } diff --git a/lib/features/intro/presentation/bloc/intro_event.dart b/lib/features/intro/presentation/bloc/intro_event.dart index 5a38075..5577c28 100644 --- a/lib/features/intro/presentation/bloc/intro_event.dart +++ b/lib/features/intro/presentation/bloc/intro_event.dart @@ -2,4 +2,6 @@ sealed class IntroEvent { const IntroEvent(); } -class ChangeIntroEvent extends IntroEvent {} +class InitVideosEvent extends IntroEvent {} + +class ChangeVideosEvent extends IntroEvent {} diff --git a/lib/features/intro/presentation/ui/intro_page.dart b/lib/features/intro/presentation/ui/intro_page.dart index 87aa98e..0ef36e9 100644 --- a/lib/features/intro/presentation/ui/intro_page.dart +++ b/lib/features/intro/presentation/ui/intro_page.dart @@ -16,7 +16,7 @@ class IntroPage extends StatelessWidget { return Scaffold( body: SizedBox.expand( child: GestureDetector( - onTap: () => context.read().add(ChangeIntroEvent()), + onTap: () => context.read().add(ChangeVideosEvent()), child: Stack( children: [ _mainScreen(), diff --git a/lib/features/intro/presentation/ui/screens/intro_1_screen.dart b/lib/features/intro/presentation/ui/screens/intro_1_screen.dart index 7e76806..37926cd 100644 --- a/lib/features/intro/presentation/ui/screens/intro_1_screen.dart +++ b/lib/features/intro/presentation/ui/screens/intro_1_screen.dart @@ -1,54 +1,24 @@ import 'package:flutter/material.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; -import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; -import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart'; -import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; -import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:pod_player/pod_player.dart'; class Intro1Screen extends StatelessWidget { const Intro1Screen({super.key}); @override Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: MyImage(image: MyAssets.intro_1, fit: BoxFit.cover), - ), - PositionedDirectional( - end: setSize( - context: context, - mobile: MySpaces.s10, - tablet: 0.15.w, - ), - top: setSize( - context: context, - mobile: 0.15.h, - tablet: 0.25.h, - ), - width: 290, - child: SlideUpFade( - delay: Duration(milliseconds: 300), - child: BubbleChatWidget( - text: context.translate.intro_1_1, - flip: true, - ), - ), - ), - PositionedDirectional( - start: setSize(context: context, mobile: MySpaces.s30, tablet: 0.2.w), - top: setSize(context: context, mobile: 0.3.h, tablet: 0.35.h), - width: 250, - child: SlideUpFade( - delay: Duration(milliseconds: 800), - child: BubbleChatWidget(text: context.translate.intro_1_2), - ), - ), - ], + return SizedBox.expand( + child: PodVideoPlayer( + controller: context.read().podController1, + overlayBuilder: (options) => SizedBox.shrink(), + alwaysShowProgressBar: false, + videoAspectRatio: context.widthScreen / context.heightScreen, + frameAspectRatio: context.widthScreen / context.heightScreen, + backgroundColor: Color(0XFF00154C), + onLoading: (context) => SizedBox.shrink(), + ), ); } } diff --git a/lib/features/intro/presentation/ui/screens/intro_2_screen.dart b/lib/features/intro/presentation/ui/screens/intro_2_screen.dart index 47ed928..6ecdacb 100644 --- a/lib/features/intro/presentation/ui/screens/intro_2_screen.dart +++ b/lib/features/intro/presentation/ui/screens/intro_2_screen.dart @@ -1,37 +1,25 @@ import 'package:flutter/material.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; -import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; -import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart'; -import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; -import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:pod_player/pod_player.dart'; class Intro2Screen extends StatelessWidget { const Intro2Screen({super.key}); @override Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: Transform.flip( - flipX: true, - child: MyImage(image: MyAssets.intro_2, fit: BoxFit.cover), - ), - ), - PositionedDirectional( - end: setSize(context: context, mobile: MySpaces.s40, tablet: 0.3.w), - top: setSize(context: context, mobile: 0.17.h, tablet: 0.23.h), - width: 250, - child: SlideUpFade( - delay: Duration(milliseconds: 300), - child: BubbleChatWidget(text: context.translate.intro_2), - ), - ), - ], + return SizedBox.expand( + child: PodVideoPlayer( + controller: context.read().podController2, + overlayBuilder: (options) => SizedBox.shrink(), + alwaysShowProgressBar: false, + videoAspectRatio: context.widthScreen / context.heightScreen, + frameAspectRatio: context.widthScreen / context.heightScreen, + backgroundColor: MyColors.transparent, + onLoading: (context) => SizedBox.shrink(), + ), ); } } diff --git a/lib/features/intro/presentation/ui/screens/intro_3_screen.dart b/lib/features/intro/presentation/ui/screens/intro_3_screen.dart index 3386651..1330dff 100644 --- a/lib/features/intro/presentation/ui/screens/intro_3_screen.dart +++ b/lib/features/intro/presentation/ui/screens/intro_3_screen.dart @@ -1,37 +1,25 @@ import 'package:flutter/material.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; -import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; -import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart'; -import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; -import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:pod_player/pod_player.dart'; class Intro3Screen extends StatelessWidget { const Intro3Screen({super.key}); @override Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: MyImage(image: MyAssets.intro_3, fit: BoxFit.cover), - ), - PositionedDirectional( - start: setSize(context: context, mobile: MySpaces.s30), - top: setSize(context: context, mobile: 180, tablet: 0.25.h), - width: 270, - child: SlideUpFade( - delay: Duration(milliseconds: 300), - child: BubbleChatWidget( - text: context.translate.intro_3, - flip: true, - ), - ), - ), - ], + return SizedBox.expand( + child: PodVideoPlayer( + controller: context.read().podController3, + overlayBuilder: (options) => SizedBox.shrink(), + alwaysShowProgressBar: false, + videoAspectRatio: context.widthScreen / context.heightScreen, + frameAspectRatio: context.widthScreen / context.heightScreen, + backgroundColor: MyColors.transparent, + onLoading: (context) => SizedBox.shrink(), + ), ); } } diff --git a/lib/features/intro/presentation/ui/screens/intro_4_screen.dart b/lib/features/intro/presentation/ui/screens/intro_4_screen.dart index e7a1562..b365751 100644 --- a/lib/features/intro/presentation/ui/screens/intro_4_screen.dart +++ b/lib/features/intro/presentation/ui/screens/intro_4_screen.dart @@ -1,36 +1,25 @@ import 'package:flutter/material.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_spaces.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; -import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; -import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart'; -import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; -import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:pod_player/pod_player.dart'; class Intro4Screen extends StatelessWidget { const Intro4Screen({super.key}); @override Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: MyImage(image: MyAssets.intro_4, fit: BoxFit.cover), - ), - PositionedDirectional( - start: setSize(context: context, mobile: MySpaces.s10, tablet: 0.2.w), - bottom: setSize(context: context, mobile: 0.4.h, tablet: 0.4.h), - width: 237, - child: SlideUpFade( - delay: Duration(milliseconds: 300), - child: BubbleChatWidget( - text: context.translate.intro_4, - ), - ), - ), - ], + return SizedBox.expand( + child: PodVideoPlayer( + controller: context.read().podController4, + overlayBuilder: (options) => SizedBox.shrink(), + alwaysShowProgressBar: false, + videoAspectRatio: context.widthScreen / context.heightScreen, + frameAspectRatio: context.widthScreen / context.heightScreen, + backgroundColor: MyColors.transparent, + onLoading: (context) => SizedBox.shrink(), + ), ); } } diff --git a/lib/features/intro/presentation/ui/screens/intro_5_screen.dart b/lib/features/intro/presentation/ui/screens/intro_5_screen.dart index 7228d8f..7a235cf 100644 --- a/lib/features/intro/presentation/ui/screens/intro_5_screen.dart +++ b/lib/features/intro/presentation/ui/screens/intro_5_screen.dart @@ -1,34 +1,25 @@ import 'package:flutter/material.dart'; -import 'package:hadi_hoda_flutter/common_ui/resources/my_assets.dart'; -import 'package:hadi_hoda_flutter/core/utils/my_localization.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:hadi_hoda_flutter/common_ui/resources/my_colors.dart'; import 'package:hadi_hoda_flutter/core/utils/screen_size.dart'; -import 'package:hadi_hoda_flutter/core/utils/set_platform_size.dart'; -import 'package:hadi_hoda_flutter/core/widgets/animations/slide_up_fade.dart'; -import 'package:hadi_hoda_flutter/core/widgets/images/my_image.dart'; -import 'package:hadi_hoda_flutter/features/intro/presentation/ui/widgets/bubble_chat_widget.dart'; +import 'package:hadi_hoda_flutter/features/intro/presentation/bloc/intro_bloc.dart'; +import 'package:pod_player/pod_player.dart'; class Intro5Screen extends StatelessWidget { const Intro5Screen({super.key}); @override Widget build(BuildContext context) { - return Stack( - alignment: Alignment.center, - children: [ - Positioned.fill( - child: MyImage(image: MyAssets.intro_5, fit: BoxFit.cover), - ), - PositionedDirectional( - top: setSize(context: context, mobile: 0.37.h, tablet: 0.42.h), - width: 200, - child: SlideUpFade( - delay: Duration(milliseconds: 300), - child: BubbleChatWidget( - text: context.translate.intro_5, - ), - ), - ), - ], + return SizedBox.expand( + child: PodVideoPlayer( + controller: context.read().podController5, + overlayBuilder: (options) => SizedBox.shrink(), + alwaysShowProgressBar: false, + videoAspectRatio: context.widthScreen / context.heightScreen, + frameAspectRatio: context.widthScreen / context.heightScreen, + backgroundColor: MyColors.transparent, + onLoading: (context) => SizedBox.shrink(), + ), ); } } diff --git a/pubspec.yaml b/pubspec.yaml index 0ecdc83..6522277 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -51,6 +51,7 @@ flutter: - assets/images/ - assets/animations/ - assets/audios/ + - assets/videos/ - path: assets/svg/ transformers: - package: vector_graphics_compiler