Android Native

development_aamir_testing23
Aamir Muhammad 2 years ago
parent fc2aceae0f
commit a8b1a001f8

@ -71,7 +71,7 @@ android {
signingConfig signingConfigs.debug signingConfig signingConfigs.debug
} }
release { release {
signingConfig signingConfigs.release signingConfig signingConfigs.debug
minifyEnabled true minifyEnabled true
shrinkResources 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 { dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
} }

@ -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.**

@ -8,6 +8,8 @@
<uses-permission android:name="android.permission.NFC" /> <uses-permission android:name="android.permission.NFC" />
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
<!-- Chat Web RTC Calling --> <!-- Chat Web RTC Calling -->
<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" /> <uses-feature android:name="android.hardware.camera.autofocus" />
@ -22,6 +24,7 @@
android:icon="@mipmap/ic_launcher" android:icon="@mipmap/ic_launcher"
android:label="Mohemm" android:label="Mohemm"
android:extractNativeLibs="true" android:extractNativeLibs="true"
android:usesCleartextTraffic="true"
android:networkSecurityConfig="@xml/network_security_config" android:networkSecurityConfig="@xml/network_security_config"
android:roundIcon="@mipmap/ic_launcher_round"> android:roundIcon="@mipmap/ic_launcher_round">
<activity <activity

@ -9,9 +9,71 @@ package com.mohem_flutter_app
import io.flutter.embedding.android.FlutterFragmentActivity import io.flutter.embedding.android.FlutterFragmentActivity
import io.flutter.embedding.engine.FlutterEngine import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant import io.flutter.plugins.GeneratedPluginRegistrant
import io.flutter.plugin.common.MethodChannel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import java.io.IOException
class MainActivity : FlutterFragmentActivity() {
private val CHANNEL = "com.example.httpchannel/http"
private lateinit var httpClient: OkHttpClient
class MainActivity: FlutterFragmentActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) { override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
GeneratedPluginRegistrant.registerWith(flutterEngine) GeneratedPluginRegistrant.registerWith(flutterEngine)
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
if (call.method == "executeHttpPostRequest") {
val arguments = call.arguments as? Map<String, Any>
// 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()
} }
} }

@ -1,5 +1,5 @@
buildscript { buildscript {
ext.kotlin_version = '1.6.0' ext.kotlin_version = '1.8.21'
repositories { repositories {
google() google()
mavenCentral() mavenCentral()

@ -3,4 +3,5 @@ distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists 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

@ -1,9 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:mohem_flutter_app/api/api_client.dart'; import 'package:mohem_flutter_app/api/api_client.dart';
import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart';
@ -31,10 +29,9 @@ class ChatApiClient {
"employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(), "employeeNumber": AppState().memberInformationList!.eMPLOYEENUMBER.toString(),
"password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG", "password": "FxIu26rWIKoF8n6mpbOmAjDLphzFGmpG",
"isMobile": true, "isMobile": true,
"deviceToken":AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken, "deviceToken": AppState().getIsHuawei ? AppState().getHuaweiPushToken : AppState().getDeviceToken,
"isHuaweiDevice": AppState().getIsHuawei, "isHuaweiDevice": AppState().getIsHuawei,
}, },
); );
if (!kReleaseMode) { if (!kReleaseMode) {
@ -188,10 +185,8 @@ class ChatApiClient {
return imagesData; return imagesData;
} }
// CallUser Login Token // CallUser Login Token
Future<user.UserAutoLoginModel> getUserCallToken({required String userid}) async { Future<user.UserAutoLoginModel> getUserCallToken({required String userid}) async {
user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel(); user.UserAutoLoginModel userLoginResponse = user.UserAutoLoginModel();
Response response = await ApiClient().postJsonForResponse( Response response = await ApiClient().postJsonForResponse(
@ -217,15 +212,18 @@ class ChatApiClient {
} }
// Call Decline On App Terminated State // Call Decline On App Terminated State
Future<Response> callDecline({required int cUserID, required int tUserID, required String targetUsertoken}) async { Future<Response> 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( Response response = await ApiClient().postJsonForResponse(
"${ApiConsts.chatLoginTokenUrl}calldecline", "${ApiConsts.chatLoginTokenUrl}calldecline",
{"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken}, {"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken},
); );
print("res: " + response.body);
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i({"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken}); logger.i({"currentUserId": cUserID, "targetUserId": tUserID, "secretKey": "derichatmobileuser", "targetUserToken": targetUsertoken});
logger.i("res: " + response.body); print("res: " + response.body);
} }
return response; return response;
} }

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:firebase_messaging/firebase_messaging.dart'; 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/entities/entities.dart';
import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart'; import 'package:flutter_callkit_incoming/flutter_callkit_incoming.dart';
import 'package:mohem_flutter_app/api/chat/chat_api_client.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:mohem_flutter_app/provider/chat_provider_model.dart';
import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/hub_connection.dart';
import 'package:signalr_netcore/signalr_client.dart'; import 'package:signalr_netcore/signalr_client.dart';
import 'package:workmanager/workmanager.dart';
class ChatVoipCall { class ChatVoipCall {
static final ChatVoipCall _instance = ChatVoipCall._internal(); static final ChatVoipCall _instance = ChatVoipCall._internal();
@ -28,6 +30,7 @@ class ChatVoipCall {
dynamic inCallData; dynamic inCallData;
bool isUserOnline = false; bool isUserOnline = false;
dynamic callData; dynamic callData;
static const platform = MethodChannel('com.example.httpchannel/http');
Future<void> showCallkitIncoming({required String uuid, RemoteMessage? data, CallDataModel? incomingCallData, bool background = false}) async { Future<void> showCallkitIncoming({required String uuid, RemoteMessage? data, CallDataModel? incomingCallData, bool background = false}) async {
await FlutterCallkitIncoming.endAllCalls(); await FlutterCallkitIncoming.endAllCalls();
@ -123,7 +126,14 @@ class ChatVoipCall {
} }
} }
} else { } 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!);
} }
} }

@ -12,7 +12,6 @@ import 'package:firebase_core_web/firebase_core_web.dart';
import 'package:firebase_messaging_web/firebase_messaging_web.dart'; import 'package:firebase_messaging_web/firebase_messaging_web.dart';
import 'package:fluttertoast/fluttertoast_web.dart'; import 'package:fluttertoast/fluttertoast_web.dart';
import 'package:geolocator_web/geolocator_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:image_picker_for_web/image_picker_for_web.dart';
import 'package:just_audio_web/just_audio_web.dart'; import 'package:just_audio_web/just_audio_web.dart';
import 'package:shared_preferences_web/shared_preferences_web.dart'; import 'package:shared_preferences_web/shared_preferences_web.dart';
@ -29,7 +28,6 @@ void registerPlugins(Registrar registrar) {
FirebaseMessagingWeb.registerWith(registrar); FirebaseMessagingWeb.registerWith(registrar);
FluttertoastWebPlugin.registerWith(registrar); FluttertoastWebPlugin.registerWith(registrar);
GeolocatorPlugin.registerWith(registrar); GeolocatorPlugin.registerWith(registrar);
GoogleMapsPlugin.registerWith(registrar);
ImagePickerPlugin.registerWith(registrar); ImagePickerPlugin.registerWith(registrar);
JustAudioPlugin.registerWith(registrar); JustAudioPlugin.registerWith(registrar);
SharedPreferencesPlugin.registerWith(registrar); SharedPreferencesPlugin.registerWith(registrar);

@ -20,6 +20,7 @@ import 'package:provider/provider.dart';
import 'package:provider/single_child_widget.dart'; import 'package:provider/single_child_widget.dart';
import 'package:signalr_netcore/hub_connection.dart'; import 'package:signalr_netcore/hub_connection.dart';
import 'package:sizer/sizer.dart'; import 'package:sizer/sizer.dart';
import 'package:workmanager/workmanager.dart';
late HubConnection chatHubConnection; late HubConnection chatHubConnection;
Logger logger = Logger( Logger logger = Logger(
@ -40,6 +41,8 @@ class MyHttpOverrides extends HttpOverrides {
} }
bool isTablet = false; bool isTablet = false;
const simpleTaskKey = "decline.call.byUser";
Future<void> main() async { Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized(); WidgetsFlutterBinding.ensureInitialized();

@ -46,12 +46,7 @@ class _StartCallPageState extends State<StartCallPage> {
IncomingCallModel? sessionData; IncomingCallModel? sessionData;
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls.isNotEmpty) { if (calls.isNotEmpty) {
dynamic values = calls[0]; sessionData = IncomingCallModel.fromRawJson(jsonEncode(calls[0]));
logger.d(calls);
print("------- We are Here ---------");
print(calls[0]);
sessionData = await IncomingCallModel.fromRawJson(jsonEncode(values));
print(sessionData.toRawJson()); print(sessionData.toRawJson());
if (provider.isUserOnline) { if (provider.isUserOnline) {
cProv.isUserOnline = provider.isUserOnline; cProv.isUserOnline = provider.isUserOnline;

@ -43,6 +43,7 @@ import 'package:mohem_flutter_app/widgets/input_widget.dart';
// import 'package:safe_device/safe_device.dart'; // import 'package:safe_device/safe_device.dart';
import 'package:wifi_iot/wifi_iot.dart'; import 'package:wifi_iot/wifi_iot.dart';
import 'package:workmanager/workmanager.dart';
class LoginScreen extends StatefulWidget { class LoginScreen extends StatefulWidget {
LoginScreen({Key? key}) : super(key: key); LoginScreen({Key? key}) : super(key: key);
@ -219,6 +220,7 @@ class _LoginScreenState extends State<LoginScreen> with WidgetsBindingObserver {
} on Exception {} } on Exception {}
} }
Future<void> moveToCallScreen() async { Future<void> moveToCallScreen() async {
dynamic calls = await FlutterCallkitIncoming.activeCalls(); dynamic calls = await FlutterCallkitIncoming.activeCalls();
if (calls is List) { if (calls is List) {

@ -91,8 +91,8 @@ dependencies:
draggable_widget: ^2.0.0 draggable_widget: ^2.0.0
flutter_local_notifications: any flutter_local_notifications: any
flutter_callkit_incoming: ^1.0.3+3 flutter_callkit_incoming: ^1.0.3+3
get_it: ^7.6.0
#firebase_analytics: any #firebase_analytics: any
workmanager: ^0.5.1
#Chat Voice Message Recoding & Play #Chat Voice Message Recoding & Play
audio_waveforms: ^0.1.5+1 audio_waveforms: ^0.1.5+1

Loading…
Cancel
Save