diff --git a/android/app/build.gradle b/android/app/build.gradle index 5279c1f..336cd2a 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -71,10 +71,10 @@ android { signingConfig signingConfigs.debug } release { - signingConfig signingConfigs.release + signingConfig signingConfigs.debug minifyEnabled true shrinkResources true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } @@ -85,4 +85,6 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.squareup.okhttp3:okhttp:4.9.1' + } diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 0000000..aa82ce6 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +-ignorewarnings +-keepattributes *Annotation* +-keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes Signature +-keepattributes SourceFile,LineNumberTable +-keep class com.huawei.hianalytics.**{*;} +-keep class com.huawei.updatesdk.**{*;} +-keep class com.huawei.hms.**{*;} +-keep class com.huawei.hms.flutter.**{*;} +-keep class com.hiennv.flutter_callkit_incoming.** { *; } +-repackageclasses + +## Flutter wrapper +-keep class io.flutter.app.** { *; } +-keep class io.flutter.plugin.** { *; } +-keep class io.flutter.util.** { *; } +-keep class io.flutter.view.** { *; } +-keep class io.flutter.** { *; } +-keep class io.flutter.plugins.** { *; } +-dontwarn io.flutter.embedding.** \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 3f5e424..91e7ba3 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,6 +8,8 @@ + + @@ -22,6 +24,7 @@ android:icon="@mipmap/ic_launcher" android:label="Mohemm" android:extractNativeLibs="true" + android:usesCleartextTraffic="true" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round"> + if (call.method == "executeHttpPostRequest") { + val arguments = call.arguments as? Map +// val argument1 = arguments?.get("argument1") +// val argument2 = arguments?.get("argument2") + println("Argument : $arguments") + // println("Argument 2: $argument2") + GlobalScope.launch { + val response = executeHttpPostRequest(arguments) + withContext(Dispatchers.Main) { + result.success(response) + } + } + } else { + result.notImplemented() + } + } + + + } + + + private suspend fun executeHttpPostRequest(payload: String ): String { + val url = "https://api.example.com/data" + // val jsonRequestBody = "{\"key\":\"value\"}" // Replace with your desired request body + + val request = Request.Builder() + .url(url) + .post(payload.toRequestBody("application/json".toMediaTypeOrNull())) + .build() + + return try { + val response: Response = httpClient.newCall(request).execute() + response.body?.string() ?: "" + } catch (e: IOException) { + e.printStackTrace() + "" + } + } + + override fun onResume() { + super.onResume() + httpClient = OkHttpClient() + } + + override fun onPause() { + super.onPause() + httpClient.dispatcher.cancelAll() } } \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 7991b9d..12dceb5 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext.kotlin_version = '1.6.0' + ext.kotlin_version = '1.8.21' repositories { google() mavenCentral() diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index ed1a787..d8f368e 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip +#distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip \ No newline at end of file diff --git a/lib/api/chat/chat_api_client.dart b/lib/api/chat/chat_api_client.dart index ecd69b0..1fa6a4b 100644 --- a/lib/api/chat/chat_api_client.dart +++ b/lib/api/chat/chat_api_client.dart @@ -1,9 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; - import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; import 'package:http/http.dart'; import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; @@ -31,10 +29,9 @@ class ChatApiClient { "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", "isMobile": true, - "deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, + "deviceToken": AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "isHuaweiDevice": AppState().getIsHuawei, }, - ); if (!kReleaseMode) { @@ -187,10 +184,8 @@ class ChatApiClient { } return imagesData; } - - - // CallUser Login Token + // CallUser Login Token Future getUserCallToken({required String userid}) async { user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel(); @@ -217,15 +212,18 @@ class ChatApiClient { } // Call Decline On App Terminated State - Future callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async { + // var headers = {'Content-Type': 'application/json'}; + // var request = http.Request('POST', Uri.parse('https://apiderichat.hmg.com/api/user/calldecline')); + Response response = await ApiClient().postJsonForResponse( "${ApiConsts.chatLoginTokenUrl}calldecline", {"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken}, ); + print("res: " + response.body); if (!kReleaseMode) { logger.i({"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken}); - logger.i("res: " + response.body); + print("res: " + response.body); } return response; } diff --git a/lib/classes/chat_call_kit.dart b/lib/classes/chat_call_kit.dart index 99b738e..128f8d8 100644 --- a/lib/classes/chat_call_kit.dart +++ b/lib/classes/chat_call_kit.dart @@ -1,5 +1,6 @@ import 'dart:convert'; import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_callkit_incoming/entities/entities.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:mohem_flutter_app/api/chat/chat_api_client.dart'; @@ -15,6 +16,7 @@ import 'package:mohem_flutter_app/provider/chat_call_provider.dart'; import 'package:mohem_flutter_app/provider/chat_provider_model.dart'; import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/signalr_client.dart'; +import 'package:workmanager/workmanager.dart'; class ChatVoipCall { static final ChatVoipCall _instance = ChatVoipCall._internal(); @@ -28,6 +30,7 @@ class ChatVoipCall { dynamic inCallData; bool isUserOnline = false; dynamic callData; + static const platform = MethodChannel('com.example.httpchannel/http'); Future showCallkitIncoming({required String uuid, RemoteMessage? data, CallDataModel? incomingCallData, bool background = false}) async { await FlutterCallkitIncoming.endAllCalls(); @@ -123,7 +126,14 @@ class ChatVoipCall { } } } else { - await ChatApiClient().callDecline(cUserID: data.extra!.callerDetails!.targetUserId!, tUserID: data.extra!.callerDetails!.currentUserId!, targetUsertoken: data.extra!.loginDetails!.token!); + try { + var response = await platform.invokeMethod( + 'executeHttpPostRequest', {"currentUserID": data.extra!.callerDetails!.targetUserId, "targetUserID": data.extra!.callerDetails!.currentUserId, "token": data.extra!.loginDetails!.token}); + print('HTTP POST response: $response'); + } on PlatformException catch (e) { + print('Error invoking method: ${e.message}'); + } + // await ChatApiClient().callDecline(cUserID: data.extra!.callerDetails!.targetUserId!, tUserID: data.extra!.callerDetails!.currentUserId!, targetUsertoken: data.extra!.loginDetails!.token!); } } diff --git a/lib/generated_plugin_registrant.dart b/lib/generated_plugin_registrant.dart index bcf8ba5..4105def 100644 --- a/lib/generated_plugin_registrant.dart +++ b/lib/generated_plugin_registrant.dart @@ -12,7 +12,6 @@ import 'package:firebase_core_web/firebase_core_web.dart'; import 'package:firebase_messaging_web/firebase_messaging_web.dart'; import 'package:fluttertoast/fluttertoast_web.dart'; import 'package:geolocator_web/geolocator_web.dart'; -import 'package:google_maps_flutter_web/google_maps_flutter_web.dart'; import 'package:image_picker_for_web/image_picker_for_web.dart'; import 'package:just_audio_web/just_audio_web.dart'; import 'package:shared_preferences_web/shared_preferences_web.dart'; @@ -29,7 +28,6 @@ void registerPlugins(Registrar registrar) { FirebaseMessagingWeb.registerWith(registrar); FluttertoastWebPlugin.registerWith(registrar); GeolocatorPlugin.registerWith(registrar); - GoogleMapsPlugin.registerWith(registrar); ImagePickerPlugin.registerWith(registrar); JustAudioPlugin.registerWith(registrar); SharedPreferencesPlugin.registerWith(registrar); diff --git a/lib/main.dart b/lib/main.dart index 08203d5..e9abb5e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,6 +20,7 @@ import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; import 'package:signalr_netcore/hub_connection.dart'; import 'package:sizer/sizer.dart'; +import 'package:workmanager/workmanager.dart'; late HubConnection chatHubConnection; Logger logger = Logger( @@ -40,6 +41,8 @@ class MyHttpOverrides extends HttpOverrides { } bool isTablet = false; +const simpleTaskKey = "decline.call.byUser"; + Future main() async { WidgetsFlutterBinding.ensureInitialized(); @@ -51,7 +54,7 @@ Future main() async { AppState().setPostParamsInitConfig(); HttpOverrides.global = MyHttpOverrides(); isTablet = MediaQueryData.fromWindow(WidgetsBinding.instance.window).size.shortestSide >= ApiConsts.tabletMinLength; - + runApp( EasyLocalization( supportedLocales: const [ diff --git a/lib/ui/chat/call/chat_incoming_call_screen.dart b/lib/ui/chat/call/chat_incoming_call_screen.dart index 48981de..2250003 100644 --- a/lib/ui/chat/call/chat_incoming_call_screen.dart +++ b/lib/ui/chat/call/chat_incoming_call_screen.dart @@ -46,12 +46,7 @@ class _StartCallPageState extends State { IncomingCallModel? sessionData; dynamic calls = await FlutterCallkitIncoming.activeCalls(); if (calls.isNotEmpty) { - dynamic values = calls[0]; - logger.d(calls); - print("------- We are Here ---------"); - print(calls[0]); - sessionData = await IncomingCallModel.fromRawJson(jsonEncode(values)); - + sessionData = IncomingCallModel.fromRawJson(jsonEncode(calls[0])); print(sessionData.toRawJson()); if (provider.isUserOnline) { cProv.isUserOnline = provider.isUserOnline; diff --git a/lib/ui/login/login_screen.dart b/lib/ui/login/login_screen.dart index b716052..33ababb 100644 --- a/lib/ui/login/login_screen.dart +++ b/lib/ui/login/login_screen.dart @@ -43,6 +43,7 @@ import 'package:mohem_flutter_app/widgets/input_widget.dart'; // import 'package:safe_device/safe_device.dart'; import 'package:wifi_iot/wifi_iot.dart'; +import 'package:workmanager/workmanager.dart'; class LoginScreen extends StatefulWidget { LoginScreen({Key? key}) : super(key: key); @@ -218,7 +219,8 @@ class _LoginScreenState extends State with WidgetsBindingObserver { }); } on Exception {} } - + + Future moveToCallScreen() async { dynamic calls = await FlutterCallkitIncoming.activeCalls(); if (calls is List) { diff --git a/pubspec.yaml b/pubspec.yaml index d685ecb..d9bf3b6 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -91,9 +91,9 @@ dependencies: draggable_widget: ^2.0.0 flutter_local_notifications: any flutter_callkit_incoming: ^1.0.3+3 - get_it: ^7.6.0 #firebase_analytics: any - + workmanager: ^0.5.1 + #Chat Voice Message Recoding & Play audio_waveforms: ^0.1.5+1 rxdart: ^0.27.7