flutter app untuk unitstock
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 

252 строки
9.1 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 '../main.dart';
  9. import 'package:location/location.dart';
  10. import 'package:permission_handler/permission_handler.dart' as pHandler;
  11. import 'Prefs.dart';
  12. import 'package:oauth2/oauth2.dart' as oauth2;
  13. class Util{
  14. bool tokenValidity = true;
  15. bool useLocal = false;
  16. getOauth2Client() async {
  17. bool resetClient = false;
  18. 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;
  19. if(restData == null)resetClient = true;
  20. else{
  21. if(DateTime.now().isAfter(restData.expiration))resetClient = true;
  22. }
  23. oauth2.Client client;
  24. if(resetClient||!tokenValidity){
  25. final tokenEndpoint = Uri.parse(prefs.getString(keyClass.restTokenAddress));
  26. if(prefs.getString(keyClass.client_credential)==null){
  27. client = await initRest();
  28. }
  29. else{
  30. var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential));
  31. client = await oauth2.clientCredentialsGrant(tokenEndpoint, clients["id"], clients["secret"],httpClient: http);
  32. prefs.setString(keyClass.rest_data, client.credentials.toJson());
  33. }
  34. }
  35. else {
  36. if (prefs.getString(keyClass.client_credential) == null) {
  37. client = await initRest();
  38. }
  39. else {
  40. var clients = JsonDecoder().convert(prefs.getString(keyClass.client_credential));
  41. client = new oauth2.Client(restData, identifier: clients["id"],
  42. secret: clients["secret"],
  43. httpClient: http);
  44. }
  45. }
  46. return client;
  47. }
  48. JsonDataPostRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
  49. var httpClient;
  50. const JsonDecoder decoder = const JsonDecoder();
  51. var headers = {'Content-type': 'application/json'};
  52. try {
  53. var response;
  54. if(secure) {
  55. httpClient = await getOauth2Client();
  56. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  57. headers["Authorization"] =
  58. "bearer ${tokenRestData.accessToken}";
  59. }
  60. else {
  61. httpClient = http;
  62. }
  63. if (timeout)
  64. response = await httpClient.post(
  65. Uri.parse(url), headers: headers,
  66. body: json.encode(jsonData)).timeout(
  67. const Duration(seconds: 10));
  68. else
  69. response = await httpClient.post(
  70. Uri.parse(url), headers: {'Content-type': 'application/json'},
  71. body: json.encode(jsonData));
  72. if(response.statusCode == 403) tokenValidity = false;
  73. if(htmlErrorTitle(response.body.toString())!=""){
  74. return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
  75. }
  76. final Map data = decoder.convert(response.body);
  77. try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
  78. return data;
  79. } on TimeoutException catch(e){
  80. return {"STATUS":0,"DATA":"Request Timeout"};
  81. }
  82. on HandshakeException catch(e){
  83. if(useLocal){
  84. return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
  85. }
  86. else{
  87. useLocal = true;
  88. http = IOClient(HttpClient(context: clientContext));
  89. return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
  90. }
  91. }
  92. on Exception catch(exception){
  93. print(url);
  94. // Toast("Not Connected to Server", Colors.red);
  95. return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
  96. }
  97. }
  98. JsonDataPutRaw(Map jsonData, String url,{secure:true,timeout:false}) async{
  99. var httpClient;
  100. const JsonDecoder decoder = const JsonDecoder();
  101. var headers = {'Content-type': 'application/json'};
  102. try {
  103. var response;
  104. if(secure) {
  105. httpClient = await getOauth2Client();
  106. oauth2.Credentials tokenRestData = oauth2.Credentials.fromJson(prefs.getString(keyClass.rest_data));
  107. headers["Authorization"] =
  108. "bearer ${tokenRestData.accessToken}";
  109. }
  110. else {
  111. httpClient = http;
  112. }
  113. if (timeout)
  114. response = await httpClient.put(
  115. Uri.parse(url), headers: headers,
  116. body: json.encode(jsonData)).timeout(
  117. const Duration(seconds: 10));
  118. else
  119. response = await httpClient.put(
  120. Uri.parse(url), headers: {'Content-type': 'application/json'},
  121. body: json.encode(jsonData));
  122. if(response.statusCode == 403) tokenValidity = false;
  123. if(htmlErrorTitle(response.body.toString())!=""){
  124. return {"STATUS":(response.statusCode != 200)?0:1,"DATA":htmlErrorTitle(response.body.toString())};
  125. }
  126. final Map data = decoder.convert(response.body);
  127. try{data["DATA"] = decoder.convert(data["DATA"]);}catch(e){}
  128. return data;
  129. } on TimeoutException catch(e){
  130. return {"STATUS":0,"DATA":"Request Timeout"};
  131. }
  132. on HandshakeException catch(e){
  133. if(useLocal){
  134. return {"STATUS":0,"DATA":"Not Connected to Server. $e"};
  135. }
  136. else{
  137. useLocal = true;
  138. http = IOClient(HttpClient(context: clientContext));
  139. return await JsonDataPostRaw(jsonData, url,timeout:timeout,secure: secure);
  140. }
  141. }
  142. on Exception catch(exception){
  143. print(url);
  144. // Toast("Not Connected to Server", Colors.red);
  145. return {"STATUS":0,"DATA":"Not Connected to Server. $exception"};
  146. }
  147. }
  148. htmlErrorTitle(String html){
  149. try{
  150. if(html.contains('<title>')) {
  151. String titleElement = html.substring(html.indexOf("<title>")+7,html.indexOf("<\/title>"));
  152. return titleElement;
  153. }
  154. else return '';
  155. }
  156. catch(e){
  157. return '';
  158. }
  159. }
  160. initRest()async{
  161. try{
  162. if(prefs.getString(keyClass.client_credential)==null){
  163. prefs.setString(keyClass.client_credential, json.encode({
  164. "id": "IZ4W8u8YZmLtUV0p1zd-_A..",
  165. "secret" : "AQ16v4bzGWm9AsWHvUcu2Q.."
  166. }).toString());
  167. }
  168. return await getOauth2Client();
  169. }
  170. catch(e){
  171. print(e);
  172. print("error fetching Rest token");
  173. }
  174. }
  175. showLoading(context,{dissmissable=false,onwillpop}){
  176. showDialog(
  177. context: context,
  178. builder: (BuildContext context) {
  179. return WillPopScope(
  180. onWillPop: onwillpop??()async{return true;},
  181. child: new Center(
  182. child: new CircularProgressIndicator(),
  183. ),
  184. );
  185. },
  186. barrierDismissible: dissmissable,
  187. );
  188. }
  189. permissionCheck(context,pHandler.Permission permissionType,ifGranted,{customMessage=''})async{
  190. pHandler.PermissionStatus permission = await permissionType.status;
  191. if(permission!= pHandler.PermissionStatus.granted){
  192. if(permission== pHandler.PermissionStatus.denied || permission== pHandler.PermissionStatus.restricted){
  193. showFlushbar(context,'${permissionType.toString().substring(permissionType.toString().lastIndexOf('.')+1)} permission is needed$customMessage. Please grant the permission!');
  194. await Future.delayed(Duration(seconds: 3));
  195. permission = await permissionType.request();
  196. }
  197. if(permission== pHandler.PermissionStatus.permanentlyDenied) {
  198. 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!');
  199. await Future.delayed(Duration(seconds: 3));
  200. pHandler.openAppSettings();
  201. SystemChannels.platform.invokeMethod('SystemNavigator.pop');
  202. }
  203. if(permission== pHandler.PermissionStatus.denied || permission== pHandler.PermissionStatus.restricted){
  204. showFlushbar(context,'${permissionType.toString().substring(permissionType.toString().lastIndexOf('.')+1)} permission is needed$customMessage. Please grant the permission!');
  205. await Future.delayed(Duration(seconds: 3));
  206. permission = await permissionType.request();
  207. }
  208. await permissionCheck(context,permissionType,ifGranted);
  209. }
  210. else{
  211. await ifGranted();
  212. }
  213. }
  214. showFlushbar(context,text,{color:Colors.grey}){
  215. Flushbar(
  216. message: "$text",
  217. backgroundColor: color,
  218. duration: Duration(seconds: 5),
  219. )..show(context);
  220. }
  221. streamLocation(context)async{
  222. print('checking location');
  223. await permissionCheck(context,pHandler.Permission.locationWhenInUse,()async{
  224. location.changeSettings(accuracy: LocationAccuracy.high);
  225. bool gpsEnabled = false;
  226. if(await location.serviceEnabled()){
  227. gpsEnabled = await location.serviceEnabled();
  228. }
  229. else{
  230. print('requesting gps');
  231. gpsEnabled = await location.requestService();
  232. await streamLocation(context);
  233. }
  234. // print([gpsEnabled,permissionEnabled]);
  235. if(gpsEnabled){
  236. if(locationStream==null){
  237. locationStream = location.onLocationChanged.listen((LocationData event) {
  238. currentPosisiton = event;
  239. });
  240. }
  241. }
  242. },customMessage: " to locate your REAL location");
  243. }
  244. }