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.
291 lines
13 KiB
Dart
291 lines
13 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/app_state/app_state.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:mohem_flutter_app/widgets/button/default_button.dart';
|
|
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!);
|
|
}
|
|
|
|
advertisementData?.actionButtonsColl!.forEach((element) {
|
|
advertisementData?.actionButtonsColl!.removeWhere((element1) => element1.actionButtonId == advertisementData?.skipButtonId);
|
|
});
|
|
|
|
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 {
|
|
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();
|
|
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,
|
|
if (advertisementData?.isOptional ?? false)
|
|
DefaultButton(AppState().isArabic(context) ? "يتخطى" : "Skip", () async {
|
|
Navigator.pop(context);
|
|
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) {
|
|
logger.d(value);
|
|
});
|
|
}).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8),
|
|
ValueListenableBuilder<bool>(
|
|
valueListenable: hasTimerEnded,
|
|
builder: (context, val, child) {
|
|
if (hasTimerEndedBool) {
|
|
return GridView.builder(
|
|
padding: EdgeInsets.zero,
|
|
itemCount: advertisementData?.actionButtonsColl!.length,
|
|
shrinkWrap: true,
|
|
physics: const NeverScrollableScrollPhysics(),
|
|
itemBuilder: (context, index) {
|
|
String? btnText = AppState().isArabic(context) ? advertisementData?.actionButtonsColl![index].btnTextAr : advertisementData?.actionButtonsColl![index].btnTextEn;
|
|
return DefaultButton(btnText!, () async {
|
|
Navigator.pop(context);
|
|
DashboardApiClient()
|
|
.setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue)
|
|
.then((value) {
|
|
logger.d(value);
|
|
});
|
|
}).paddingOnly(left: 60.0, right: 60.0, top: 8, bottom: 8);
|
|
},
|
|
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount: 1,
|
|
childAspectRatio: (7.0),
|
|
),
|
|
);
|
|
// Row(
|
|
// mainAxisAlignment: MainAxisAlignment.center,
|
|
// children: [
|
|
// Container(padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_up, color: MyColors.gradiantEndColor))
|
|
// .onPress(() {
|
|
// try {
|
|
// Navigator.pop(context);
|
|
// DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) {
|
|
// logger.d(value);
|
|
// });
|
|
// } catch (ex) {
|
|
// logger.wtf(ex);
|
|
// Utils.handleException(ex, context, null);
|
|
// }
|
|
// }),
|
|
// 20.width,
|
|
// Container(
|
|
// padding: const EdgeInsets.all(16), decoration: Utils.containerRadius(MyColors.white, 10), child: const Icon(Icons.thumb_down, color: MyColors.gradiantEndColor))
|
|
// .onPress(() {
|
|
// try {
|
|
// Navigator.pop(context);
|
|
// DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Dislike").then((value) {
|
|
// logger.d(value);
|
|
// });
|
|
// } catch (ex) {
|
|
// logger.wtf(ex);
|
|
// Utils.handleException(ex, context, null);
|
|
// }
|
|
// }),
|
|
// ],
|
|
// );
|
|
} else {
|
|
return Container();
|
|
}
|
|
},
|
|
),
|
|
20.height,
|
|
// if (advertisementData?.isOptional ?? false)
|
|
// GridView.builder(
|
|
// padding: EdgeInsets.zero,
|
|
// itemCount: advertisementData?.actionButtonsColl!.length,
|
|
// shrinkWrap: true,
|
|
// physics: const NeverScrollableScrollPhysics(),
|
|
// itemBuilder: (context, index) {
|
|
// String? btnText = AppState().isArabic(context) ? advertisementData?.actionButtonsColl![index].btnTextAr : advertisementData?.actionButtonsColl![index].btnTextEn;
|
|
// return DefaultButton(btnText!, () async {
|
|
// Navigator.pop(context);
|
|
// DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, advertisementData?.actionButtonsColl![index].actionValue).then((value) {
|
|
// logger.d(value);
|
|
// });
|
|
// }).paddingAll(8);
|
|
// },
|
|
// gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
|
// crossAxisCount: 2,
|
|
// childAspectRatio: (4.0),
|
|
// ),
|
|
// )
|
|
// DefaultButton(AppState().isArabic(context) ? advertisementData?.skipButtonTextAr ?? "Skip" : advertisementData?.skipButtonTextEn ?? "Skip", () async {
|
|
// Navigator.pop(context);
|
|
// DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Skip").then((value) {
|
|
// logger.d(value);
|
|
// });
|
|
// }).paddingOnly(left: 100, right: 100)
|
|
],
|
|
);
|
|
} 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 {
|
|
Navigator.pop(context);
|
|
DashboardApiClient().setAdvertisementViewed(masterID!, advertisementData!.advertisementId!, "Like").then((value) {
|
|
logger.d(value);
|
|
});
|
|
} catch (ex) {
|
|
logger.wtf(ex);
|
|
Utils.handleException(ex, context, null);
|
|
}
|
|
},
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|