|  |  |  | import 'dart:convert'; | 
					
						
							|  |  |  | import 'dart:io' as Io; | 
					
						
							|  |  |  | import 'dart:io'; | 
					
						
							|  |  |  | import 'dart:typed_data'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:flutter_countdown_timer/index.dart'; | 
					
						
							|  |  |  | import 'package:lottie/lottie.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/api/dashboard_api_client.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/colors.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/lottie_consts.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/classes/utils.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/int_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/string_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/main.dart'; | 
					
						
							|  |  |  | import 'package:mohem_flutter_app/models/itg/advertisement.dart' as ads; | 
					
						
							|  |  |  | import 'package:path_provider/path_provider.dart'; | 
					
						
							|  |  |  | import 'package:video_player/video_player.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ITGAdsScreen extends StatefulWidget { | 
					
						
							|  |  |  |   const ITGAdsScreen({Key? key}) : super(key: key); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   _ITGAdsScreenState createState() => _ITGAdsScreenState(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class _ITGAdsScreenState extends State<ITGAdsScreen> { | 
					
						
							|  |  |  |   late Future<VideoPlayerController> _futureController; | 
					
						
							|  |  |  |   late VideoPlayerController _controller; | 
					
						
							|  |  |  |   bool skip = false; | 
					
						
							|  |  |  |   bool isVideo = false; | 
					
						
							|  |  |  |   bool isImage = false; | 
					
						
							|  |  |  |   bool isAudio = false; | 
					
						
							|  |  |  |   String ext = ''; | 
					
						
							|  |  |  |   late File imageFile; | 
					
						
							|  |  |  |   ads.Advertisement? advertisementData; | 
					
						
							|  |  |  |   dynamic data; | 
					
						
							|  |  |  |   String? masterID; | 
					
						
							|  |  |  |   int videoDuration = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   bool hasTimerEndedBool = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   final ValueNotifier<bool> hasTimerEnded = ValueNotifier(false); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   late CountdownTimerController timerController; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void checkFileType() async { | 
					
						
							|  |  |  |     String? rFile = advertisementData!.viewAttachFileColl!.first.base64String; | 
					
						
							|  |  |  |     String? rFileExt = advertisementData!.viewAttachFileColl!.first.fileName; | 
					
						
							|  |  |  |     ext = "." + rFileExt!.split(".").last.toLowerCase(); | 
					
						
							|  |  |  |     if (ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".gif") { | 
					
						
							|  |  |  |       await processImage(rFile!); | 
					
						
							|  |  |  |       isImage = true; | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       if (ext == ".aac") { | 
					
						
							|  |  |  |         isAudio = true; | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       isVideo = true; | 
					
						
							|  |  |  |       _futureController = createVideoPlayer(rFile!); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     setState(() {}); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void changeTimer(bool isTimerEnd) { | 
					
						
							|  |  |  |     hasTimerEndedBool = isTimerEnd; | 
					
						
							|  |  |  |     hasTimerEnded.value = !hasTimerEnded.value; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void onTimerEnd() { | 
					
						
							|  |  |  |     changeTimer(true); | 
					
						
							|  |  |  |     timerController.disposeTimer(); | 
					
						
							|  |  |  |     timerController.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future processImage(String encodedBytes) async { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       Uint8List decodedBytes = base64Decode(encodedBytes.split("base64,").last); | 
					
						
							|  |  |  |       Directory appDocumentsDirectory = await getApplicationDocumentsDirectory(); // 1
 | 
					
						
							|  |  |  |       imageFile = Io.File("${appDocumentsDirectory.path}/addImage$ext"); | 
					
						
							|  |  |  |       imageFile.writeAsBytesSync(decodedBytes); | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       logger.d(e); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   Future<VideoPlayerController> createVideoPlayer(String encodedBytes) async { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       // Uint8List decodedBytes = base64Decode(encodedBytes.split("base64,").last);
 | 
					
						
							|  |  |  |       // Directory appDocumentsDirectory = await getApplicationDocumentsDirectory(); // 1
 | 
					
						
							|  |  |  |       // File file = Io.File("${appDocumentsDirectory.path}/myAdsVideo.mp4");
 | 
					
						
							|  |  |  |       // file.writeAsBytesSync(decodedBytes);
 | 
					
						
							|  |  |  |       // VideoPlayerController controller = VideoPlayerController.file(file);
 | 
					
						
							|  |  |  |       VideoPlayerController controller = VideoPlayerController.network(advertisementData!.viewAttachFileColl!.first.base64String!); | 
					
						
							|  |  |  |       await controller.initialize(); | 
					
						
							|  |  |  |       await controller.play(); | 
					
						
							|  |  |  |       await controller.setVolume(1.0); | 
					
						
							|  |  |  |       await controller.setLooping(false); | 
					
						
							|  |  |  |       return controller; | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       print(e); | 
					
						
							|  |  |  |       return VideoPlayerController.network("https://apimohemmweb.cloudsolutions.com.sa/ErmAttachment/compressedvideo.mp4"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   void initTimer() { | 
					
						
							|  |  |  |     Future.delayed(const Duration(seconds: 5), () { | 
					
						
							|  |  |  |       skip = true; | 
					
						
							|  |  |  |       // setState(() {});
 | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   void dispose() { | 
					
						
							|  |  |  |     if (_controller != null) _controller.dispose(); | 
					
						
							|  |  |  |     // player.stop();
 | 
					
						
							|  |  |  |     // player.dispose();
 | 
					
						
							|  |  |  |     super.dispose(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							|  |  |  |     data = ModalRoute.of(context)!.settings.arguments; | 
					
						
							|  |  |  |     advertisementData ??= data["advertisement"] as ads.Advertisement; | 
					
						
							|  |  |  |     masterID ??= data["masterId"]; | 
					
						
							|  |  |  |     if (advertisementData != null) { | 
					
						
							|  |  |  |       checkFileType(); | 
					
						
							|  |  |  |       videoDuration = advertisementData?.durationInSeconds ?? 0; | 
					
						
							|  |  |  |       timerController = CountdownTimerController(endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: onTimerEnd); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return Scaffold( | 
					
						
							|  |  |  |       backgroundColor: Colors.black, | 
					
						
							|  |  |  |       body: Stack( | 
					
						
							|  |  |  |         children: [ | 
					
						
							|  |  |  |           if (isVideo) | 
					
						
							|  |  |  |             FutureBuilder( | 
					
						
							|  |  |  |               future: _futureController, | 
					
						
							|  |  |  |               builder: (BuildContext context, AsyncSnapshot<Object?> snapshot) { | 
					
						
							|  |  |  |                 if (snapshot.connectionState == ConnectionState.done && snapshot.data != null) { | 
					
						
							|  |  |  |                   _controller = snapshot.data as VideoPlayerController; | 
					
						
							|  |  |  |                   return Column( | 
					
						
							|  |  |  |                     mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |                     children: [ | 
					
						
							|  |  |  |                       Center( | 
					
						
							|  |  |  |                         child: isAudio | 
					
						
							|  |  |  |                             ? Lottie.asset(MyLottieConsts.audioPlaybackLottie) | 
					
						
							|  |  |  |                             : AspectRatio( | 
					
						
							|  |  |  |                                 aspectRatio: _controller.value.aspectRatio, | 
					
						
							|  |  |  |                                 child: VideoPlayer(_controller), | 
					
						
							|  |  |  |                               ), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       30.height, | 
					
						
							|  |  |  |                       CountdownTimer( | 
					
						
							|  |  |  |                         controller: timerController, | 
					
						
							|  |  |  |                         endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, | 
					
						
							|  |  |  |                         endWidget: "00:00:00".toText16(color: Colors.white, isBold: true), | 
					
						
							|  |  |  |                         textStyle: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold), | 
					
						
							|  |  |  |                       ), | 
					
						
							|  |  |  |                       50.height, | 
					
						
							|  |  |  |                       ValueListenableBuilder<bool>( | 
					
						
							|  |  |  |                           valueListenable: hasTimerEnded, | 
					
						
							|  |  |  |                           builder: (context, val, child) { | 
					
						
							|  |  |  |                             if (hasTimerEndedBool) { | 
					
						
							|  |  |  |                               return Container( | 
					
						
							|  |  |  |                                       padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)) | 
					
						
							|  |  |  |                                   .onPress(() { | 
					
						
							|  |  |  |                                 try { | 
					
						
							|  |  |  |                                   DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) { | 
					
						
							|  |  |  |                                     logger.d(value); | 
					
						
							|  |  |  |                                     Navigator.pop(context); | 
					
						
							|  |  |  |                                   }); | 
					
						
							|  |  |  |                                 } catch (ex) { | 
					
						
							|  |  |  |                                   logger.wtf(ex); | 
					
						
							|  |  |  |                                   Utils.handleException(ex, context, null); | 
					
						
							|  |  |  |                                 } | 
					
						
							|  |  |  |                               }); | 
					
						
							|  |  |  |                             } else { | 
					
						
							|  |  |  |                               return Container(); | 
					
						
							|  |  |  |                             } | 
					
						
							|  |  |  |                           }), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                       // DefaultButton(LocaleKeys.home.tr(), () async {
 | 
					
						
							|  |  |  |                       //   DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) {
 | 
					
						
							|  |  |  |                       //     logger.d(value);
 | 
					
						
							|  |  |  |                       //   });
 | 
					
						
							|  |  |  |                       // }).paddingOnly(left: 50, right: 50)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                       // ElevatedButton(
 | 
					
						
							|  |  |  |                       //   onPressed: () async {
 | 
					
						
							|  |  |  |                       //     // DashboardApiClient().setAdvertisementViewed(widget.addMasterId, widget.advertisement!.advertisementId!).then((value) {
 | 
					
						
							|  |  |  |                       //     //   logger.d(value);
 | 
					
						
							|  |  |  |                       //     // });
 | 
					
						
							|  |  |  |                       //   },
 | 
					
						
							|  |  |  |                       //   child: const Text("Go To Dashboard"),
 | 
					
						
							|  |  |  |                       // )
 | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                   ); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                   return const Center( | 
					
						
							|  |  |  |                     child: CircularProgressIndicator(), | 
					
						
							|  |  |  |                   ); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |               }, | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |           if (isImage) | 
					
						
							|  |  |  |             Column( | 
					
						
							|  |  |  |               crossAxisAlignment: CrossAxisAlignment.center, | 
					
						
							|  |  |  |               mainAxisAlignment: MainAxisAlignment.center, | 
					
						
							|  |  |  |               children: [ | 
					
						
							|  |  |  |                 Image.file(imageFile), | 
					
						
							|  |  |  |                 50.height, | 
					
						
							|  |  |  |                 Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor)).onPress( | 
					
						
							|  |  |  |                   () { | 
					
						
							|  |  |  |                     try { | 
					
						
							|  |  |  |                       DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!).then((value) { | 
					
						
							|  |  |  |                         logger.d(value); | 
					
						
							|  |  |  |                         Navigator.pop(context); | 
					
						
							|  |  |  |                       }); | 
					
						
							|  |  |  |                     } catch (ex) { | 
					
						
							|  |  |  |                       logger.wtf(ex); | 
					
						
							|  |  |  |                       Utils.handleException(ex, context, null); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                   }, | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |       ), | 
					
						
							|  |  |  |     ); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |