From e9a3aaaceba7fb0f04f51fc0355492c06e8abc4c Mon Sep 17 00:00:00 2001 From: Sikander Saleem Date: Sun, 7 Jan 2024 13:56:55 +0300 Subject: [PATCH] welcome video api added. --- android/app/build.gradle | 2 +- android/build.gradle | 4 +- android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/local.properties | 6 +- lib/api/api_client.dart | 117 +++++++++++++----- lib/api/tangheem_user_api_client.dart | 6 + lib/models/welcome_video_model.dart | 28 +++++ lib/new_ui/common_home_parent.dart | 21 +++- lib/widgets/video_player_widget.dart | 2 +- 10 files changed, 148 insertions(+), 43 deletions(-) create mode 100644 lib/models/welcome_video_model.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 20bc427..71a11f6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -33,7 +33,7 @@ if (keystorePropertiesFile.exists()) { } android { - compileSdkVersion 33 + compileSdk 33 sourceSets { main.java.srcDirs += 'src/main/kotlin' diff --git a/android/build.gradle b/android/build.gradle index f1ff2c7..6ae9a4c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -6,8 +6,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' - classpath 'com.google.gms:google-services:4.3.3' + classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.google.gms:google-services:4.3.13' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } diff --git a/android/gradle.properties b/android/gradle.properties index f233e28..511799f 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,5 +1,4 @@ org.gradle.jvmargs=-Xmx1536M android.useAndroidX=true android.enableJetifier=true -android.enableR8=true -android.jetifier.blacklist=bcprov-jdk15on \ No newline at end of file +android.jetifier.ignorelist=bcprov-jdk15on \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 493072b..cc5527d 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip diff --git a/android/local.properties b/android/local.properties index 61508b4..e7392b0 100644 --- a/android/local.properties +++ b/android/local.properties @@ -1,5 +1,5 @@ sdk.dir=/Users/sikandersaleem/Library/Android/sdk flutter.sdk=/Users/sikandersaleem/sdks/flutter -flutter.buildMode=release -flutter.versionName=1.1.0 -flutter.versionCode=2 \ No newline at end of file +flutter.buildMode=debug +flutter.versionName=1.1.1 +flutter.versionCode=3 \ No newline at end of file diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart index c90706b..4496030 100644 --- a/lib/api/api_client.dart +++ b/lib/api/api_client.dart @@ -77,11 +77,7 @@ class ApiClient { print("Url:$url"); print("body:${jsonEncode(jsonObject)}"); } - var response = await postJsonForResponse(url, jsonObject, token: token, - queryParameters: queryParameters, - headers: _headers, - retryTimes: retryTimes, - isPutRequest: isPutRequest); + var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes, isPutRequest: isPutRequest); try { var jsonData = jsonDecode(response.body); return factoryConstructor(jsonData); @@ -102,11 +98,7 @@ class ApiClient { } } - return await _postForResponse(url, requestBody, token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes, - isPutRequest: isPutRequest); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes, isPutRequest: isPutRequest); } Future _postForResponse(String url, requestBody, {String token, Map queryParameters, Map headers, int retryTimes = 0, bool isPutRequest = false}) async { @@ -135,11 +127,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1, - isPutRequest: isPutRequest); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1, isPutRequest: isPutRequest); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -147,11 +135,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1, - isPutRequest: isPutRequest); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1, isPutRequest: isPutRequest); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -161,11 +145,7 @@ class ApiClient { if (retryTimes > 0) { print('will retry after 3 seconds...'); await Future.delayed(Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, - queryParameters: queryParameters, - headers: headers, - retryTimes: retryTimes - 1, - isPutRequest: isPutRequest); + return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1, isPutRequest: isPutRequest); } else { throw APIException(APIException.OTHER, arguments: e); } @@ -175,8 +155,7 @@ class ApiClient { bool _certificateCheck(X509Certificate cert, String host, int port) => true; Future _withClient(Future Function(Client) fn) async { - var httpClient = HttpClient() - ..badCertificateCallback = _certificateCheck; + var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; var client = IOClient(httpClient); try { return await fn(client); @@ -185,12 +164,92 @@ class ApiClient { } } - Future _post(url, {Map headers, body, Encoding encoding, bool isPutRequest = false}) => - _withClient((client) { + Future _post(url, {Map headers, body, Encoding encoding, bool isPutRequest = false}) => _withClient((client) { if (isPutRequest) { return client.put(url, headers: headers, body: body, encoding: encoding); } else { return client.post(url, headers: headers, body: body, encoding: encoding); } }); + + Future getJsonForObject(FactoryConstructor factoryConstructor, String url, {String token, Map queryParameters, Map headers, int retryTimes = 0}) async { + var _headers = {'Accept': 'application/json'}; + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + if (!kReleaseMode) { + print("Url:$url"); + } + var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); + try { + var jsonData = jsonDecode(response.body); + return factoryConstructor(jsonData); + } catch (ex) { + throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); + } + } + + Future getJsonForResponse(String url, {String token, Map queryParameters, Map headers, int retryTimes = 0}) async { + headers = {'Content-Type': 'application/json'}; + + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); + } + + Future _getForResponse(String url, {String token, Map queryParameters, Map headers, int retryTimes = 0}) async { + try { + var _headers = {}; + if (token != null) { + _headers['Authorization'] = 'Bearer $token'; + } + + if (headers != null && headers.isNotEmpty) { + _headers.addAll(headers); + } + + if (queryParameters != null) { + var queryString = new Uri(queryParameters: queryParameters).query; + url = url + '?' + queryString; + } + var response = await _get( + Uri.parse(url), + headers: _headers, + ).timeout(Duration(minutes: 2)); + + if (response.statusCode >= 200 && response.statusCode < 300) { + return response; + } else { + throw _throwAPIException(response); + } + } on SocketException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on HttpException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } on TimeoutException catch (e) { + throw APIException(APIException.TIMEOUT, arguments: e); + } on ClientException catch (e) { + if (retryTimes > 0) { + print('will retry after 3 seconds...'); + await Future.delayed(Duration(seconds: 3)); + return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); + } else { + throw APIException(APIException.OTHER, arguments: e); + } + } + } + + Future _get(url, {Map headers}) => _withClient((client) { + return client.get(url, headers: headers); + }); } diff --git a/lib/api/tangheem_user_api_client.dart b/lib/api/tangheem_user_api_client.dart index 2008b67..606f9bf 100644 --- a/lib/api/tangheem_user_api_client.dart +++ b/lib/api/tangheem_user_api_client.dart @@ -14,6 +14,7 @@ import 'package:tangheem/models/navigation_model.dart'; import 'package:tangheem/models/quick_links_model.dart'; import 'package:tangheem/models/surah_model.dart'; import 'package:tangheem/models/tangheem_type_model.dart'; +import 'package:tangheem/models/welcome_video_model.dart'; import 'api_client.dart'; @@ -175,4 +176,9 @@ class TangheemUserApiClient { var postParams = {"contentTypeId": contentId}; return await ApiClient().postJsonForObject((json) => ContentInfoModel.fromJson(json), url, postParams); } + + Future getWelcomeVideo() async { + String url = "${ApiConsts.tangheemUsers}WelcomeVideoUrl_Get"; + return await ApiClient().getJsonForObject((json) => WelcomeVideoModel.fromJson(json).welcomeVideoUrl, url); + } } diff --git a/lib/models/welcome_video_model.dart b/lib/models/welcome_video_model.dart new file mode 100644 index 0000000..70c6149 --- /dev/null +++ b/lib/models/welcome_video_model.dart @@ -0,0 +1,28 @@ +class WelcomeVideoModel { + int totalItemsCount; + int statusCode; + String message; + String welcomeVideoUrl; + + WelcomeVideoModel({this.totalItemsCount, this.statusCode, this.message, this.welcomeVideoUrl}); + + WelcomeVideoModel.fromJson(Map json) { + totalItemsCount = json['totalItemsCount']; + statusCode = json['statusCode']; + message = json['message']; + if (json['data'] != null) { + welcomeVideoUrl = json['data']['welcomevideoUrl']; + } + } + + Map toJson() { + final Map data = new Map(); + data['totalItemsCount'] = this.totalItemsCount; + data['statusCode'] = this.statusCode; + data['message'] = this.message; + if (this.welcomeVideoUrl != null) { + data['data']['welcomevideoUrl'] = this.welcomeVideoUrl; + } + return data; + } +} diff --git a/lib/new_ui/common_home_parent.dart b/lib/new_ui/common_home_parent.dart index 85049fb..17ce272 100644 --- a/lib/new_ui/common_home_parent.dart +++ b/lib/new_ui/common_home_parent.dart @@ -28,6 +28,7 @@ import 'package:tangheem/ui/screens/pdf_viewer_screen.dart'; import 'package:tangheem/ui/screens/quran_screen.dart'; import 'package:tangheem/widgets/video_player_widget.dart'; import 'package:url_launcher/url_launcher.dart'; +import 'package:youtube_player_flutter/youtube_player_flutter.dart'; class CommonHomeParent extends StatefulWidget { CommonHomeParent({Key key}) : super(key: key); @@ -84,13 +85,26 @@ class _CommonHomeParentState extends State { builder: (BuildContext context) => GeneralDialog(), ); } - showWelcomeVideoDialog(); + getWelcomeVideo(); + // showWelcomeVideoDialog(); }); } - void showWelcomeVideoDialog() async { + void getWelcomeVideo() async { + Utils.showLoading(context); + try { + String link = await TangheemUserApiClient().getWelcomeVideo(); + Utils.hideLoading(context); + link = YoutubePlayer.convertUrlToId(link); + showWelcomeVideoDialog(link); + } catch (ex) { + if (mounted) Utils.handleException(ex, null); + Utils.hideLoading(context); + } + } + + void showWelcomeVideoDialog(String permLink) async { prefs = await SharedPreferences.getInstance(); - String permLink = "-PqP0BCiTlE"; String link = prefs.getString(GlobalConsts.welcomeVideoUrl) ?? permLink; if (permLink == link) { await prefs.setString(GlobalConsts.welcomeVideoUrl, permLink); @@ -112,7 +126,6 @@ class _CommonHomeParentState extends State { @override Widget build(BuildContext context) { bool isPortrait = MediaQuery.of(context).orientation == Orientation.portrait; - return Scaffold( backgroundColor: Color(0xffF4F4F4), resizeToAvoidBottomInset: true, diff --git a/lib/widgets/video_player_widget.dart b/lib/widgets/video_player_widget.dart index a0ce5fe..7af05e6 100644 --- a/lib/widgets/video_player_widget.dart +++ b/lib/widgets/video_player_widget.dart @@ -21,7 +21,7 @@ class VideoPlayerWidget extends StatefulWidget { } class _VideoPlayerWidgetState extends State { - bool doNotShowAgain = false; + bool doNotShowAgain = true; YoutubePlayerController _controller; @override