You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			181 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			181 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Dart
		
	
| 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;
 | |
| 
 | |
|   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<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);
 | |
|       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<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(
 | |
|                         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),
 | |
|         ],
 | |
|       ),
 | |
|     );
 | |
|   }
 | |
| }
 |