flutter app untuk unitstock
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 
 

369 satır
13 KiB

  1. import 'dart:async';
  2. import 'dart:convert';
  3. import 'dart:io';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:flushbar/flushbar.dart';
  7. import 'package:http/io_client.dart';
  8. import 'package:in_app_update/in_app_update.dart';
  9. import 'package:url_launcher/url_launcher.dart';
  10. import '../main.dart';
  11. import 'package:location/location.dart';
  12. import 'package:permission_handler/permission_handler.dart' as pHandler;
  13. import 'Prefs.dart';
  14. import 'package:oauth2/oauth2.dart' as oauth2;
  15. // import 'package:flutter_logs/flutter_logs.dart';
  16. class Util{
  17. bool tokenValidity = true;
  18. bool useLocal = false;
  19. getMinAppVer()async{
  20. var req = await JsonDataGetRaw(null,'${prefs.getString(keyClass.hostAddress)}/app/min_ver/');
  21. return req;
  22. }
  23. launchURL(String url) async {
  24. if (await canLaunch(url)) {
  25. await launch(url);
  26. } else {
  27. throw 'Could not launch $url';
  28. }
  29. }
  30. updateDialog(context)async{
  31. WidgetsBinding.instance.addPostFrameCallback((_) async {
  32. await showDialog(
  33. context: context,
  34. builder: (BuildContext context) {
  35. return WillPopScope(
  36. onWillPop: (){
  37. return null;
  38. },
  39. child: AlertDialog(
  40. title: Text('App version is too old'),
  41. content: Text('Please update the application'),
  42. actions: <Widget>[
  43. TextButton(
  44. child: Text('Update',style: TextStyle(color: Colors.blue),),
  45. onPressed: ()async{
  46. try{
  47. AppUpdateInfo _updateInfo;
  48. _updateInfo = await InAppUpdate.checkForUpdate();
  49. if(_updateInfo?.updateAvailability == 2){
  50. await InAppUpdate.performImmediateUpdate();
  51. }
  52. else throw {"message":"manual Update"};
  53. // util.showFlushbar(context, "${_updateInfo?.updateAvailable}");
  54. }
  55. catch(e){
  56. await Future.delayed(Duration(milliseconds: 500));
  57. await launchURL('https://play.google.com/store/apps/details?id=com.thamringroup.unitstocks');
  58. // util.showFlushbar(context, "Failed checking updates. $e.");
  59. }
  60. },
  61. ),
  62. ],
  63. ),
  64. );
  65. },
  66. barrierDismissible: false,
  67. );
  68. });
  69. }
  70. getOauth2Client() async {
  71. bool resetClient = false;
  72. oauth2.Credentials restData = (prefs.getString(keyClass.rest_data)!=null&&prefs.getString(keyClass.rest_data).contains("accessToken"))?oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data)):null;
  73. if(restData == null)resetClient = true;
  74. else{
  75. if(DateTime.now().isAfter(restData.expiration))resetClient = true;
  76. }
  77. oauth2.Client client;
  78. if(resetClient||!tokenValidity){
  79. final tokenEndpoint = Uri.parse(prefs.getString(keyClass.restTokenAddress));
  80. if(prefs.getString(keyClass.client_credential)==null){
  81. client = await initRest();
  82. }
  83. else{
  84. var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential));
  85. client = await oauth2.clientCredentialsGrant(tokenEndpoint, clients["id"], clients["secret"],httpClient: http);
  86. prefs.setString(keyClass.rest_data, client.credentials.toJson());
  87. }
  88. }
  89. else {
  90. if (prefs.getString(keyClass.client_credential) == null) {
  91. client = await initRest();
  92. }
  93. else {
  94. var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential));
  95. client = new oauth2.Client(restData, identifier: clients["id"],
  96. secret: clients["secret"],
  97. httpClient: http);
  98. }
  99. }
  100. return client;
  101. }
  102. JsonDataPostRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
  103. var httpClient;
  104. const JsonDecoder decoder = const JsonDecoder();
  105. var headers = {'Content-type': 'application/json'};
  106. try {
  107. var response;
  108. if(secure) {
  109. httpClient = await getOauth2Client();
  110. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  111. headers["Authorization"] =
  112. "bearer ${tokenRestData.accessToken}";
  113. }
  114. else {
  115. httpClient = http;
  116. }
  117. if (timeout)
  118. response = await httpClient.post(
  119. Uri.parse(url), headers: headers,
  120. body: json.encode(jsonData)).timeout(
  121. const Duration(seconds: 10));
  122. else
  123. response = await httpClient.post(
  124. Uri.parse(url), headers: {'Content-type': 'application/json'},
  125. body: json.encode(jsonData));
  126. if(response.statusCode == 403) tokenValidity = false;
  127. if(htmlErrorTitle(response.body.toString())!=""){
  128. return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
  129. }
  130. final Map data = decoder.convert(response.body);
  131. try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
  132. return data;
  133. } on TimeoutException catch(e){
  134. return {"STATUS":0,"DATA":"Request Timeout"};
  135. }
  136. on HandshakeException catch(e){
  137. if(useLocal){
  138. return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
  139. }
  140. else{
  141. useLocal = true;
  142. http = IOClient(HttpClient(context: clientContext));
  143. return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
  144. }
  145. }
  146. on Exception catch(exception){
  147. print(url);
  148. // Toast("Not Connected to Server", Colors.red);
  149. return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
  150. }
  151. }
  152. JsonDataGetRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
  153. var httpClient;
  154. const JsonDecoder decoder = const JsonDecoder();
  155. var headers = {'Content-type': 'application/json'};
  156. try {
  157. var response;
  158. if(secure) {
  159. httpClient = await getOauth2Client();
  160. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  161. headers["Authorization"] =
  162. "bearer ${tokenRestData.accessToken}";
  163. }
  164. else {
  165. httpClient = http;
  166. }
  167. if(jsonData!= null&&jsonData.length!=0) {
  168. url = url + '?';
  169. for (var i in jsonData.keys) {
  170. url = url + i + '=' + jsonData[i] + '&';
  171. }
  172. url = url.substring(0, url.length - 1);
  173. }
  174. if (timeout)
  175. response = await httpClient.get(
  176. Uri.parse(url), headers: headers,
  177. ).timeout(const Duration(seconds: 10));
  178. else
  179. response = await httpClient.get(
  180. Uri.parse(url), headers: {'Content-type': 'application/json'},
  181. );
  182. if(response.statusCode == 403) tokenValidity = false;
  183. if(htmlErrorTitle(response.body.toString())!=""){
  184. return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
  185. }
  186. final Map data = decoder.convert(response.body);
  187. try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
  188. return data;
  189. } on TimeoutException catch(e){
  190. return {"STATUS":0,"DATA":"Request Timeout"};
  191. }
  192. on HandshakeException catch(e){
  193. if(useLocal){
  194. return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
  195. }
  196. else{
  197. useLocal = true;
  198. http = IOClient(HttpClient(context: clientContext));
  199. return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
  200. }
  201. }
  202. on Exception catch(exception){
  203. print(url);
  204. // Toast("Not Connected to Server", Colors.red);
  205. return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
  206. }
  207. }
  208. JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
  209. var httpClient;
  210. const JsonDecoder decoder = const JsonDecoder();
  211. var headers = {'Content-type': 'application/json'};
  212. try {
  213. var response;
  214. if(secure) {
  215. httpClient = await getOauth2Client();
  216. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  217. headers["Authorization"] =
  218. "bearer ${tokenRestData.accessToken}";
  219. }
  220. else {
  221. httpClient = http;
  222. }
  223. if (timeout)
  224. response = await httpClient.put(
  225. Uri.parse(url), headers: headers,
  226. body: json.encode(jsonData)).timeout(
  227. const Duration(seconds: 10));
  228. else
  229. response = await httpClient.put(
  230. Uri.parse(url), headers: {'Content-type': 'application/json'},
  231. body: json.encode(jsonData));
  232. if(response.statusCode == 403) tokenValidity = false;
  233. if(htmlErrorTitle(response.body.toString())!=""){
  234. return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
  235. }
  236. final Map data = decoder.convert(response.body);
  237. try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
  238. return data;
  239. } on TimeoutException catch(e){
  240. return {"STATUS":0,"DATA":"Request Timeout"};
  241. }
  242. on HandshakeException catch(e){
  243. if(useLocal){
  244. return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
  245. }
  246. else{
  247. useLocal = true;
  248. http = IOClient(HttpClient(context: clientContext));
  249. return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
  250. }
  251. }
  252. on Exception catch(exception){
  253. print(url);
  254. // Toast("Not Connected to Server", Colors.red);
  255. return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
  256. }
  257. }
  258. htmlErrorTitle(String html){
  259. // FlutterLogs.logInfo("TAG", "subTag", html);
  260. try{
  261. if(html.contains('<title>')) {
  262. String titleElement = html.substring(html.indexOf("<title>")+7,html.indexOf("<\/title>"));
  263. return titleElement;
  264. }
  265. return '';
  266. }
  267. catch(e){
  268. return '';
  269. }
  270. }
  271. initRest()async{
  272. try{
  273. if(prefs.getString(keyClass.client_credential)==null){
  274. prefs.setString(keyClass.client_credential, json.encode({
  275. "id": "IZ4W8u8YZmLtUV0p1zd-_A..",
  276. "secret" : "AQ16v4bzGWm9AsWHvUcu2Q.."
  277. }).toString());
  278. }
  279. return await getOauth2Client();
  280. }
  281. catch(e){
  282. print(e);
  283. print("error fetching Rest token");
  284. }
  285. }
  286. showLoading(context,{dissmissable=false,onwillpop}){
  287. showDialog(
  288. context: context,
  289. builder: (BuildContext context) {
  290. return WillPopScope(
  291. onWillPop: onwillpop??()async{return true;},
  292. child: new Center(
  293. child: new CircularProgressIndicator(),
  294. ),
  295. );
  296. },
  297. barrierDismissible: dissmissable,
  298. );
  299. }
  300. permissionCheck(context,pHandler.Permission permissionType,ifGranted,{customMessage=''})async{
  301. pHandler.PermissionStatus permission = await permissionType.status;
  302. if(permission!= pHandler.PermissionStatus.granted){
  303. if(permission== pHandler.PermissionStatus.denied || permission== pHandler.PermissionStatus.restricted){
  304. showFlushbar(context,'${permissionType.toString().substring(permissionType.toString().lastIndexOf('.')+1)} permission is needed$customMessage. Please grant the permission!');
  305. await Future.delayed(Duration(seconds: 3));
  306. permission = await permissionType.request();
  307. }
  308. if(permission== pHandler.PermissionStatus.permanentlyDenied) {
  309. showFlushbar(context,'It seems, your system security explicitly denied access to your ${permissionType.toString().substring(permissionType.toString().lastIndexOf('.')+1)} permission. Please MANUALLY enable it in setings!');
  310. await Future.delayed(Duration(seconds: 3));
  311. pHandler.openAppSettings();
  312. SystemChannels.platform.invokeMethod('SystemNavigator.pop');
  313. }
  314. if(permission== pHandler.PermissionStatus.denied || permission== pHandler.PermissionStatus.restricted){
  315. showFlushbar(context,'${permissionType.toString().substring(permissionType.toString().lastIndexOf('.')+1)} permission is needed$customMessage. Please grant the permission!');
  316. await Future.delayed(Duration(seconds: 3));
  317. permission = await permissionType.request();
  318. }
  319. await permissionCheck(context,permissionType,ifGranted);
  320. }
  321. else{
  322. await ifGranted();
  323. }
  324. }
  325. showFlushbar(context,text,{color:Colors.grey}){
  326. Flushbar(
  327. message: "$text",
  328. backgroundColor: color,
  329. duration: Duration(seconds: 5),
  330. )..show(context);
  331. }
  332. streamLocation(context)async{
  333. print('checking location');
  334. await permissionCheck(context,pHandler.Permission.locationWhenInUse,()async{
  335. location.changeSettings(accuracy: LocationAccuracy.high);
  336. bool gpsEnabled = false;
  337. if(await location.serviceEnabled()){
  338. gpsEnabled = await location.serviceEnabled();
  339. }
  340. else{
  341. print('requesting gps');
  342. gpsEnabled = await location.requestService();
  343. await streamLocation(context);
  344. }
  345. // print([gpsEnabled,permissionEnabled]);
  346. if(gpsEnabled){
  347. if(locationStream==null){
  348. locationStream = location.onLocationChanged.listen((LocationData event) {
  349. currentPosisiton = event;
  350. });
  351. }
  352. }
  353. },customMessage: " to locate your REAL location");
  354. }
  355. }