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 { late Future _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; 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(() {}); } 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 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); await controller.initialize(); await controller.play(); await controller.setVolume(1.0); await controller.setLooping(false); return controller; } catch (e) { return VideoPlayerController.asset("dataSource"); } } void initTimer() { Future.delayed(const Duration(seconds: 5), () { skip = true; // setState(() {}); }); } @override void dispose() { _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; } return Scaffold( backgroundColor: Colors.black, body: Stack( children: [ if (isVideo) FutureBuilder( future: _futureController, builder: (BuildContext context, AsyncSnapshot 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( endTime: DateTime.now().millisecondsSinceEpoch + 1000 * videoDuration, onEnd: null, endWidget: "00:00:00".toText14(color: Colors.white, isBold: true), textStyle: const TextStyle(color: Colors.white, fontSize: 16, letterSpacing: -0.48, fontWeight: FontWeight.bold), ), 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); } }), // 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) Image.file(imageFile), ], ), ); } }