diff --git a/assets/audios/back.mp3 b/assets/audios/back.mp3 new file mode 100644 index 0000000..b2a877a Binary files /dev/null and b/assets/audios/back.mp3 differ diff --git a/assets/audios/click_button.mp3 b/assets/audios/click_button.mp3 new file mode 100644 index 0000000..ea977e9 Binary files /dev/null and b/assets/audios/click_button.mp3 differ diff --git a/assets/audios/diamond_end.mp3 b/assets/audios/diamond_end.mp3 new file mode 100644 index 0000000..5938bb7 Binary files /dev/null and b/assets/audios/diamond_end.mp3 differ diff --git a/assets/audios/diamond_increase.mp3 b/assets/audios/diamond_increase.mp3 new file mode 100644 index 0000000..831a8ec Binary files /dev/null and b/assets/audios/diamond_increase.mp3 differ diff --git a/assets/audios/home.mp3 b/assets/audios/home.mp3 new file mode 100644 index 0000000..637448f Binary files /dev/null and b/assets/audios/home.mp3 differ diff --git a/assets/audios/incorrect_answer.mp3 b/assets/audios/incorrect_answer.mp3 new file mode 100644 index 0000000..17eabf6 Binary files /dev/null and b/assets/audios/incorrect_answer.mp3 differ diff --git a/assets/audios/question.mp3 b/assets/audios/question.mp3 new file mode 100644 index 0000000..495f6c1 Binary files /dev/null and b/assets/audios/question.mp3 differ diff --git a/assets/audios/right_answer.mp3 b/assets/audios/right_answer.mp3 new file mode 100644 index 0000000..de51d68 Binary files /dev/null and b/assets/audios/right_answer.mp3 differ diff --git a/lib/common_ui/resources/my_audios.dart b/lib/common_ui/resources/my_audios.dart new file mode 100644 index 0000000..e499c25 --- /dev/null +++ b/lib/common_ui/resources/my_audios.dart @@ -0,0 +1,8 @@ +class MyAudios { + static const MyAudios _i = MyAudios._internal(); + const MyAudios._internal(); + factory MyAudios() => _i; + + static const String homeMusic = 'assets/audios/home.mp3'; + static const String clickButton = 'assets/audios/click_button.mp3'; +} \ No newline at end of file diff --git a/lib/core/constants/my_constants.dart b/lib/core/constants/my_constants.dart index c157bdd..f0489fd 100644 --- a/lib/core/constants/my_constants.dart +++ b/lib/core/constants/my_constants.dart @@ -13,4 +13,7 @@ class MyConstants { static const String selectLanguage = 'SELECT_LANGUAGE'; static const String firstDownload = 'FIRST_DOWNLOAD'; static const String currentLevel = 'CURRENT_LEVEL'; + static const String mainAudioService = 'MAIN_AUDIO_SERVICE'; + static const String effectAudioService = 'EFFECT_AUDIO_SERVICE'; + static const double mainAudioVolume = 0.5; } \ No newline at end of file diff --git a/lib/core/routers/my_routes.dart b/lib/core/routers/my_routes.dart index 92ad404..0c25651 100644 --- a/lib/core/routers/my_routes.dart +++ b/lib/core/routers/my_routes.dart @@ -1,5 +1,6 @@ import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:go_router/go_router.dart'; +import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; import 'package:hadi_hoda_flutter/core/middlewares/my_middlewares.dart'; import 'package:hadi_hoda_flutter/core/utils/context_provider.dart'; import 'package:hadi_hoda_flutter/features/download/presentation/bloc/download_bloc.dart'; @@ -93,7 +94,10 @@ GoRouter get appPages => GoRouter( name: Routes.homePage, path: Routes.homePage, builder: (context, state) => BlocProvider( - create: (context) => HomeBloc(locator()), + create: (context) => + HomeBloc(locator(instanceName: MyConstants.mainAudioService), + locator(instanceName: MyConstants.effectAudioService), + ), child: const HomePage(), ), ), @@ -101,7 +105,11 @@ GoRouter get appPages => GoRouter( name: Routes.levelPage, path: Routes.levelPage, builder: (context, state) => BlocProvider( - create: (context) => LevelBloc(locator(), locator())..add(SetCurrentLevelEvent()), + create: (context) => + LevelBloc( + locator(), + locator(instanceName: MyConstants.mainAudioService), + )..add(SetCurrentLevelEvent()), child: const LevelPage(), ), ), diff --git a/lib/core/services/audio_service.dart b/lib/core/services/audio_service.dart index 9670981..0bd3def 100644 --- a/lib/core/services/audio_service.dart +++ b/lib/core/services/audio_service.dart @@ -3,21 +3,32 @@ import 'package:just_audio/just_audio.dart'; class AudioService { final AudioPlayer _player = AudioPlayer(); + final double? volume; - Future setAudio({String? filePath}) async { + AudioService({this.volume}) { + _player.setVolume(volume ?? 1); + } + + Future setAudio({String? filePath, String? assetPath}) async { try { - return _player.setAudioSource(AudioSource.file(filePath ?? '')); + if (filePath != null) { + return await _player.setAudioSource(AudioSource.file(filePath)); + } else if (assetPath != null) { + return await _player.setAudioSource(AudioSource.asset(assetPath)); + } else { + return null; + } } catch (e) { if (kDebugMode) { print('$e'); } - return Duration.zero; + return null; } } Future play() async { try { - return _player.play(); + await _player.play(); } catch (e) { if (kDebugMode) { print('$e'); @@ -27,7 +38,7 @@ class AudioService { Future pause() async { try { - return _player.pause(); + await _player.pause(); } catch (e) { if (kDebugMode) { print('$e'); @@ -37,7 +48,7 @@ class AudioService { Future stop() async { try { - return _player.stop(); + await _player.stop(); } catch (e) { if (kDebugMode) { print('$e'); @@ -47,7 +58,7 @@ class AudioService { Future dispose() async { try { - return _player.dispose(); + await _player.dispose(); } catch (e) { if (kDebugMode) { print('$e'); @@ -58,7 +69,7 @@ class AudioService { Future changeMute() async { try { if (_player.volume == 0) { - await _player.setVolume(1); + await _player.setVolume(volume ?? 1); } else { await _player.setVolume(0); } @@ -69,6 +80,16 @@ class AudioService { } } + Future setVolume({required double volume}) async { + try { + await _player.setVolume(volume); + } catch (e) { + if (kDebugMode) { + print('$e'); + } + } + } + Stream volumeStream() async* { try { yield* _player.volumeStream; @@ -78,4 +99,18 @@ class AudioService { } } } + + Future setLoopMode({bool isLoop = false}) async { + try { + if (isLoop) { + await _player.setLoopMode(LoopMode.all); + } else { + await _player.setLoopMode(LoopMode.off); + } + } catch (e) { + if (kDebugMode) { + print('$e'); + } + } + } } diff --git a/lib/features/home/presentation/bloc/home_bloc.dart b/lib/features/home/presentation/bloc/home_bloc.dart index 219c7ed..54d9b92 100644 --- a/lib/features/home/presentation/bloc/home_bloc.dart +++ b/lib/features/home/presentation/bloc/home_bloc.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:bloc/bloc.dart'; import 'package:flutter/cupertino.dart'; import 'package:go_router/go_router.dart'; +import 'package:hadi_hoda_flutter/common_ui/resources/my_audios.dart'; import 'package:hadi_hoda_flutter/core/constants/my_constants.dart'; import 'package:hadi_hoda_flutter/core/routers/my_routes.dart'; import 'package:hadi_hoda_flutter/core/services/audio_service.dart'; @@ -16,9 +17,11 @@ import 'package:hive/hive.dart'; class HomeBloc extends Bloc { /// ------------constructor------------ HomeBloc( - this._audioService, + this._mainAudioService, + this._effectAudioService, ) : super(const HomeState()) { - volumeStream = _audioService.volumeStream(); + volumeStream = _mainAudioService.volumeStream(); + playMusic(); on(_getHomeEvent); } @@ -28,10 +31,12 @@ class HomeBloc extends Bloc { late final Stream volumeStream; /// ------------Controllers------------ - final AudioService _audioService; + final AudioService _mainAudioService; + final AudioService _effectAudioService; /// ------------Functions------------ void goToLevelPage(BuildContext context){ + playEffect(); final String? selectedLanguage = LocalStorage.readData(key: MyConstants.selectLanguage); final Box dataBox = Hive.box(MyConstants.levelBox); final TotalDataEntity findData = dataBox.values.singleWhere( @@ -46,16 +51,36 @@ class HomeBloc extends Bloc { } void goToLanguagePage(BuildContext context){ + playEffect(); context.pushNamed(Routes.languagePage); } void showAboutUs(BuildContext context){ + playEffect(); showAboutUsDialog(context: context); } Future changeMute() async { - await _audioService.changeMute(); + playEffect(); + await Future.wait([ + _mainAudioService.changeMute(), + _effectAudioService.changeMute(), + ]); } + + Future playMusic() async { + Future.wait([ + _mainAudioService.setAudio(assetPath: MyAudios.homeMusic), + _mainAudioService.setLoopMode(isLoop: true), + ]); + await _mainAudioService.play(); + } + + Future playEffect() async{ + await _effectAudioService.setAudio(assetPath: MyAudios.clickButton); + await _effectAudioService.play(); + } + /// ------------Api Calls------------ FutureOr _getHomeEvent(event, emit) async {} } diff --git a/lib/features/home/presentation/ui/home_page.dart b/lib/features/home/presentation/ui/home_page.dart index 04338fc..c79bf5f 100644 --- a/lib/features/home/presentation/ui/home_page.dart +++ b/lib/features/home/presentation/ui/home_page.dart @@ -46,7 +46,7 @@ class HomePage extends StatelessWidget { builder: (context, snapshot) => InkWell( onTap: () => context.read().changeMute(), child: MyImage( - image: snapshot.data == 1 ? MyAssets.musicOn : MyAssets.musicOff, + image: snapshot.data == 0 ? MyAssets.musicOff : MyAssets.musicOn, size: setSize(context: context, tablet: 100), ), ), diff --git a/lib/init_bindings.dart b/lib/init_bindings.dart index b85c523..f81c487 100644 --- a/lib/init_bindings.dart +++ b/lib/init_bindings.dart @@ -39,7 +39,14 @@ final GetIt locator = GetIt.I; void initBindings() { /// Classes locator.registerSingleton(HttpRequestImpl()); - locator.registerSingleton(AudioService()); + locator.registerSingleton( + AudioService(volume: MyConstants.mainAudioVolume), + instanceName: MyConstants.mainAudioService, + ); + locator.registerSingleton( + AudioService(), + instanceName: MyConstants.effectAudioService, + ); /// Sample Feature locator.registerLazySingleton(() => SampleDatasourceImpl(locator())); diff --git a/pubspec.yaml b/pubspec.yaml index c367fd7..62fc865 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -47,6 +47,7 @@ flutter: - assets/fonts/ - assets/images/ - assets/animations/ + - assets/audios/ - path: assets/svg/ transformers: - package: vector_graphics_compiler