From 63ffabcc864a4ca82b1784a2463a872e857ae738 Mon Sep 17 00:00:00 2001 From: Zohaib Iqbal Kambrani <> Date: Tue, 14 Dec 2021 10:20:21 +0300 Subject: [PATCH] no message --- android/app/agconnect-services.json | 66 +- android/app/build.gradle | 12 +- android/app/proguard-rules.pro | 25 +- android/app/src/main/AndroidManifest.xml | 31 + .../CustomFlutterHmsMessageService.java | 56 ++ android/build.gradle | 5 +- .../gradle/wrapper/gradle-wrapper.properties | 6 +- ios/Podfile | 87 +- ios/Podfile.lock | 824 +++++------------- .../contents.xcworkspacedata | 2 +- ios/Runner/AppDelegate.swift | 4 +- ios/Runner/Helper/OpenTokPlatformBridge.swift | 85 +- ios/Runner/OpenTok/OpenTok.swift | 317 +++---- lib/main.dart | 8 +- .../conference/web_rtc/call_home_page.dart | 277 ++---- .../conference/web_rtc/call_home_page_.dart | 186 ++++ .../web_rtc/widgets/cam_view_widget.dart | 34 +- lib/pages/landing/landing_page.dart | 236 +---- lib/pages/livecare/incoming_call.dart | 116 +-- lib/uitl/app_shared_preferences.dart | 2 +- lib/uitl/navigation_service.dart | 13 +- lib/uitl/push-notification-handler.dart | 279 ++++++ pubspec.yaml | 7 +- 23 files changed, 1191 insertions(+), 1487 deletions(-) create mode 100644 android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/bkp_files/CustomFlutterHmsMessageService.java create mode 100644 lib/pages/conference/web_rtc/call_home_page_.dart create mode 100644 lib/uitl/push-notification-handler.dart diff --git a/android/app/agconnect-services.json b/android/app/agconnect-services.json index cfdaf83b..91aad2c7 100644 --- a/android/app/agconnect-services.json +++ b/android/app/agconnect-services.json @@ -1,6 +1,21 @@ { + "agcgw":{ + "backurl":"connect-drcn.hispace.hicloud.com", + "url":"connect-drcn.dbankcloud.cn", + "websocketbackurl":"connect-ws-drcn.hispace.dbankcloud.com", + "websocketurl":"connect-ws-drcn.hispace.dbankcloud.cn" + }, + "agcgw_all":{ + "CN":"connect-drcn.dbankcloud.cn", + "CN_back":"connect-drcn.hispace.hicloud.com", + "DE":"connect-dre.dbankcloud.cn", + "DE_back":"connect-dre.hispace.hicloud.com", + "RU":"connect-drru.dbankcloud.cn", + "RU_back":"connect-drru.hispace.hicloud.com", + "SG":"connect-dra.dbankcloud.cn", + "SG_back":"connect-dra.hispace.hicloud.com" + }, "client":{ - "appType":"1", "cp_id":"2640966000002322881", "product_id":"736430079244816567", "client_id":"563735388191982656", @@ -10,5 +25,50 @@ "api_key":"CgB6e3x9DJzMgRCmnT6dyUEkp6UsIfddb6l3w0ZEXzeiRMHEFi3400Z5fJ5qaHneU0OrAI/JRpk+DMGVs3QpUxlI", "package_name":"com.ejada.hmg" }, - "configuration_version":"1.0" -} \ No newline at end of file + "oauth_client":{ + "client_id":"102857389", + "client_type":1 + }, + "app_info":{ + "app_id":"102857389", + "package_name":"com.ejada.hmg" + }, + "service":{ + "analytics":{ + "collector_url":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "collector_url_ru":"datacollector-drru.dt.hicloud.com,datacollector-drru.dt.dbankcloud.cn", + "collector_url_sg":"datacollector-dra.dt.hicloud.com,datacollector-dra.dt.dbankcloud.cn", + "collector_url_de":"datacollector-dre.dt.hicloud.com,datacollector-dre.dt.dbankcloud.cn", + "collector_url_cn":"datacollector-drcn.dt.hicloud.com,datacollector-drcn.dt.dbankcloud.cn", + "resource_id":"p1", + "channel_id":"" + }, + "search":{ + "url":"https://search-drcn.cloud.huawei.com" + }, + "cloudstorage":{ + "storage_url":"https://agc-storage-drcn.platform.dbankcloud.cn" + }, + "ml":{ + "mlservice_url":"ml-api-drcn.ai.dbankcloud.com,ml-api-drcn.ai.dbankcloud.cn" + } + }, + "region":"CN", + "configuration_version":"3.0", + "appInfos":[ + { + "package_name":"com.ejada.hmg", + "client":{ + "app_id":"102857389" + }, + "app_info":{ + "package_name":"com.ejada.hmg", + "app_id":"102857389" + }, + "oauth_client":{ + "client_type":1, + "client_id":"102857389" + } + } + ] +} diff --git a/android/app/build.gradle b/android/app/build.gradle index 25230849..79a27897 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -67,6 +67,7 @@ android { } release { signingConfig signingConfigs.config + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } staging { // Specifies a sorted list of fallback build types that the @@ -77,6 +78,15 @@ android { matchingFallbacks = ['debug', 'qa', 'release'] } } + + packagingOptions { + exclude 'META-INF/proguard/androidx-annotations.pro' + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } flutter { @@ -112,7 +122,7 @@ dependencies { implementation "com.opentok.android:opentok-android-sdk:2.19.1" - compile 'com.facebook.stetho:stetho:1.5.1' + implementation 'com.facebook.stetho:stetho:1.5.1' implementation 'com.facebook.stetho:stetho-urlconnection:1.5.1' diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 4ace459d..cfab1fd6 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -1,4 +1,27 @@ -keep class tvi.webrtc.** { *; } -keep class com.twilio.video.** { *; } -keep class com.twilio.common.** { *; } --keepattributes InnerClasses \ No newline at end of file +-keepattributes InnerClasses + +-keep class com.ejada.** { *; } +-keep class org.webrtc.** { *; } + +-ignorewarnings +-keepattributes *Annotation* +-keepattributes Exceptions +-keepattributes InnerClasses +-keepattributes Signature +-keep class com.hianalytics.android.**{*;} +-keep class com.huawei.updatesdk.**{*;} +-keep class com.huawei.hms.**{*;} + +## 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.** +-keep class com.huawei.hms.flutter.** { *; } +-repackageclasses \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 8aa7ad73..07242edb 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -46,6 +46,8 @@ android:showOnLockScreen="true" android:screenOrientation="sensorPortrait" android:label="Dr. Alhabib"> + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/bkp_files/CustomFlutterHmsMessageService.java b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/bkp_files/CustomFlutterHmsMessageService.java new file mode 100644 index 00000000..c96a60af --- /dev/null +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/bkp_files/CustomFlutterHmsMessageService.java @@ -0,0 +1,56 @@ +/* +* --------------- +* Note: Todo +* --------------- +* Need to be place in huawei_push (package com.huawei.hms.flutter.push.hms) and define in huawei_push manifest.xml +* */ + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.util.Log; + +import com.huawei.hms.flutter.push.hms.FlutterHmsMessageService; +import com.huawei.hms.flutter.push.utils.ApplicationUtils; + +import org.json.JSONObject; + +//package com.huawei.hms.flutter.push.hms +// +// +//import android.content.Context; +//import android.content.Intent; +//import android.content.SharedPreferences; +// +//import com.huawei.hms.flutter.push.hms.FlutterHmsMessageService; +//import com.huawei.hms.flutter.push.utils.ApplicationUtils; +//import com.huawei.hms.push.RemoteMessage; +// +//import org.json.JSONObject; +// +//public class CustomFlutterHmsMessageService extends FlutterHmsMessageService { +// @Override +// public void onMessageReceived(RemoteMessage remoteMessage) { +// super.onMessageReceived(remoteMessage); +// try { +// String jsonStr = remoteMessage.getData(); +// JSONObject json_data = new JSONObject(jsonStr); +// JSONObject json_data_data = new JSONObject(json_data.getString("data")); +// if(json_data_data.getString("is_call").equalsIgnoreCase("true")){ +// boolean isApplicationInForeground = ApplicationUtils.isApplicationInForeground(this); +// if(!isApplicationInForeground){ +// SharedPreferences preferences = getSharedPreferences("FlutterSharedPreferences", Context.MODE_PRIVATE); +// preferences.edit().putString("flutter.call_data", json_data.getString("data")).apply(); +// +// Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); +// intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); +// startActivity(intent); +// Log.v("onMessageReceived", "startActivity(intent) called"); +// } +// } +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } +//} diff --git a/android/build.gradle b/android/build.gradle index ecb1ed70..b33d5f1b 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -11,10 +11,11 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.4' + classpath 'com.android.tools.build:gradle:7.0.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.google.gms:google-services:4.3.8' - classpath 'com.huawei.agconnect:agcp:1.4.2.301' +// classpath 'com.huawei.agconnect:agcp:1.4.2.301' + classpath 'com.huawei.agconnect:agcp:1.5.2.300' } } diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 6fdb0e44..09db0fed 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Jul 14 15:55:18 AST 2021 +#Sun Dec 12 12:44:08 AST 2021 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +zipStoreBase=GRADLE_USER_HOME diff --git a/ios/Podfile b/ios/Podfile index 46c98373..1e8c3c90 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -1,9 +1,8 @@ # Uncomment this line to define a global platform for your project -# platform :ios, '10.0' +# platform :ios, '9.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' -$FirebaseAnalyticsWithoutAdIdSupport = true project 'Runner', { 'Debug' => :debug, @@ -11,86 +10,32 @@ project 'Runner', { 'Release' => :release, } -# pod 'FBSDKCoreKit' -# pod 'FBSDKLoginKit' - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" end - generated_key_values = {} - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) do |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - generated_key_values[podname] = podpath - else - puts "Invalid plugin specification: #{line}" - end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches end - generated_key_values + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" end +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + target 'Runner' do use_frameworks! use_modular_headers! - # Native Pods - pod 'NVActivityIndicatorView' - pod 'OpenTok' - - - # Flutter Pod - copied_flutter_dir = File.join(__dir__, 'Flutter') - copied_framework_path = File.join(copied_flutter_dir, 'Flutter.framework') - copied_podspec_path = File.join(copied_flutter_dir, 'Flutter.podspec') - unless File.exist?(copied_framework_path) && File.exist?(copied_podspec_path) - # Copy Flutter.framework and Flutter.podspec to Flutter/ to have something to link against if the xcode backend script has not run yet. - # That script will copy the correct debug/profile/release version of the framework based on the currently selected Xcode configuration. - # CocoaPods will not embed the framework on pod install (before any build phases can generate) if the dylib does not exist. - - generated_xcode_build_settings_path = File.join(copied_flutter_dir, 'Generated.xcconfig') - unless File.exist?(generated_xcode_build_settings_path) - raise "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter pub get is executed first" - end - generated_xcode_build_settings = parse_KV_file(generated_xcode_build_settings_path) - cached_framework_dir = generated_xcode_build_settings['FLUTTER_FRAMEWORK_DIR']; - - unless File.exist?(copied_framework_path) - FileUtils.cp_r(File.join(cached_framework_dir, 'Flutter.framework'), copied_flutter_dir) - end - unless File.exist?(copied_podspec_path) - FileUtils.cp(File.join(cached_framework_dir, 'Flutter.podspec'), copied_flutter_dir) - end - end - - # Keep pod path relative so it can be checked into Podfile.lock. - pod 'Flutter', :path => 'Flutter' - - # Plugin Pods - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.each do |name, path| - symlink = File.join('.symlinks', 'plugins', name) - File.symlink(path, symlink) - pod name, :path => File.join(symlink, 'ios') - end + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end post_install do |installer| installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end + flutter_additional_ios_build_settings(target) end end - diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 565b2db9..169a7b58 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,246 +1,16 @@ PODS: - - abseil/algorithm (0.20200225.0): - - abseil/algorithm/algorithm (= 0.20200225.0) - - abseil/algorithm/container (= 0.20200225.0) - - abseil/algorithm/algorithm (0.20200225.0): - - abseil/base/config - - abseil/algorithm/container (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/base (0.20200225.0): - - abseil/base/atomic_hook (= 0.20200225.0) - - abseil/base/base (= 0.20200225.0) - - abseil/base/base_internal (= 0.20200225.0) - - abseil/base/bits (= 0.20200225.0) - - abseil/base/config (= 0.20200225.0) - - abseil/base/core_headers (= 0.20200225.0) - - abseil/base/dynamic_annotations (= 0.20200225.0) - - abseil/base/endian (= 0.20200225.0) - - abseil/base/errno_saver (= 0.20200225.0) - - abseil/base/exponential_biased (= 0.20200225.0) - - abseil/base/log_severity (= 0.20200225.0) - - abseil/base/malloc_internal (= 0.20200225.0) - - abseil/base/periodic_sampler (= 0.20200225.0) - - abseil/base/pretty_function (= 0.20200225.0) - - abseil/base/raw_logging_internal (= 0.20200225.0) - - abseil/base/spinlock_wait (= 0.20200225.0) - - abseil/base/throw_delegate (= 0.20200225.0) - - abseil/base/atomic_hook (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/base (0.20200225.0): - - abseil/base/atomic_hook - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/log_severity - - abseil/base/raw_logging_internal - - abseil/base/spinlock_wait - - abseil/meta/type_traits - - abseil/base/base_internal (0.20200225.0): - - abseil/base/config - - abseil/meta/type_traits - - abseil/base/bits (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/config (0.20200225.0) - - abseil/base/core_headers (0.20200225.0): - - abseil/base/config - - abseil/base/dynamic_annotations (0.20200225.0) - - abseil/base/endian (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/errno_saver (0.20200225.0): - - abseil/base/config - - abseil/base/exponential_biased (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/log_severity (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/malloc_internal (0.20200225.0): - - abseil/base/base - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/base/dynamic_annotations - - abseil/base/raw_logging_internal - - abseil/base/periodic_sampler (0.20200225.0): - - abseil/base/core_headers - - abseil/base/exponential_biased - - abseil/base/pretty_function (0.20200225.0) - - abseil/base/raw_logging_internal (0.20200225.0): - - abseil/base/atomic_hook - - abseil/base/config - - abseil/base/core_headers - - abseil/base/log_severity - - abseil/base/spinlock_wait (0.20200225.0): - - abseil/base/base_internal - - abseil/base/core_headers - - abseil/base/errno_saver - - abseil/base/throw_delegate (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/container/compressed_tuple (0.20200225.0): - - abseil/utility/utility - - abseil/container/inlined_vector (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/container/inlined_vector_internal - - abseil/memory/memory - - abseil/container/inlined_vector_internal (0.20200225.0): - - abseil/base/core_headers - - abseil/container/compressed_tuple - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/span - - abseil/memory (0.20200225.0): - - abseil/memory/memory (= 0.20200225.0) - - abseil/memory/memory (0.20200225.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/meta (0.20200225.0): - - abseil/meta/type_traits (= 0.20200225.0) - - abseil/meta/type_traits (0.20200225.0): - - abseil/base/config - - abseil/numeric/int128 (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/strings/internal (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/meta/type_traits - - abseil/strings/str_format (0.20200225.0): - - abseil/strings/str_format_internal - - abseil/strings/str_format_internal (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/types/span - - abseil/strings/strings (0.20200225.0): - - abseil/base/base - - abseil/base/bits - - abseil/base/config - - abseil/base/core_headers - - abseil/base/endian - - abseil/base/raw_logging_internal - - abseil/base/throw_delegate - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/numeric/int128 - - abseil/strings/internal - - abseil/time (0.20200225.0): - - abseil/time/internal (= 0.20200225.0) - - abseil/time/time (= 0.20200225.0) - - abseil/time/internal (0.20200225.0): - - abseil/time/internal/cctz (= 0.20200225.0) - - abseil/time/internal/cctz (0.20200225.0): - - abseil/time/internal/cctz/civil_time (= 0.20200225.0) - - abseil/time/internal/cctz/time_zone (= 0.20200225.0) - - abseil/time/internal/cctz/civil_time (0.20200225.0): - - abseil/base/config - - abseil/time/internal/cctz/time_zone (0.20200225.0): - - abseil/base/config - - abseil/time/internal/cctz/civil_time - - abseil/time/time (0.20200225.0): - - abseil/base/base - - abseil/base/core_headers - - abseil/base/raw_logging_internal - - abseil/numeric/int128 - - abseil/strings/strings - - abseil/time/internal/cctz/civil_time - - abseil/time/internal/cctz/time_zone - - abseil/types (0.20200225.0): - - abseil/types/any (= 0.20200225.0) - - abseil/types/bad_any_cast (= 0.20200225.0) - - abseil/types/bad_any_cast_impl (= 0.20200225.0) - - abseil/types/bad_optional_access (= 0.20200225.0) - - abseil/types/bad_variant_access (= 0.20200225.0) - - abseil/types/compare (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - abseil/types/span (= 0.20200225.0) - - abseil/types/variant (= 0.20200225.0) - - abseil/types/any (0.20200225.0): - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/bad_any_cast - - abseil/utility/utility - - abseil/types/bad_any_cast (0.20200225.0): - - abseil/base/config - - abseil/types/bad_any_cast_impl - - abseil/types/bad_any_cast_impl (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_optional_access (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/bad_variant_access (0.20200225.0): - - abseil/base/config - - abseil/base/raw_logging_internal - - abseil/types/compare (0.20200225.0): - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/optional (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/memory/memory - - abseil/meta/type_traits - - abseil/types/bad_optional_access - - abseil/utility/utility - - abseil/types/span (0.20200225.0): - - abseil/algorithm/algorithm - - abseil/base/core_headers - - abseil/base/throw_delegate - - abseil/meta/type_traits - - abseil/types/variant (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/base/core_headers - - abseil/meta/type_traits - - abseil/types/bad_variant_access - - abseil/utility/utility - - abseil/utility/utility (0.20200225.0): - - abseil/base/base_internal - - abseil/base/config - - abseil/meta/type_traits - - android_intent (0.0.1): + - audio_session (0.0.1): - Flutter - barcode_scan_fix (0.0.1): - Flutter - MTBBarcodeScanner - - BoringSSL-GRPC (0.0.7): - - BoringSSL-GRPC/Implementation (= 0.0.7) - - BoringSSL-GRPC/Interface (= 0.0.7) - - BoringSSL-GRPC/Implementation (0.0.7): - - BoringSSL-GRPC/Interface (= 0.0.7) - - BoringSSL-GRPC/Interface (0.0.7) - - cloud_firestore (0.14.4): - - Firebase/CoreOnly (~> 6.33.0) - - Firebase/Firestore (~> 6.33.0) - - firebase_core - - Flutter - - cloud_firestore_web (0.1.0): + - camera (0.0.1): - Flutter - connectivity (0.0.1): - Flutter - Reachability - - connectivity_for_web (0.1.0): - - Flutter - - connectivity_macos (0.0.1): - - Flutter - device_calendar (0.0.1): - Flutter - - device_info (0.0.1): - - Flutter - DKImagePickerController/Core (4.3.2): - DKImagePickerController/ImageDataManager - DKImagePickerController/Resource @@ -275,188 +45,152 @@ PODS: - file_picker (0.0.1): - DKImagePickerController/PhotoGallery - Flutter - - file_picker_web (0.0.1): - - Flutter - - Firebase/Analytics (6.33.0): + - Firebase/Analytics (8.9.0): - Firebase/Core - - Firebase/Core (6.33.0): + - Firebase/Core (8.9.0): - Firebase/CoreOnly - - FirebaseAnalytics (= 6.8.3) - - Firebase/CoreOnly (6.33.0): - - FirebaseCore (= 6.10.3) - - Firebase/Firestore (6.33.0): + - FirebaseAnalytics (~> 8.9.0) + - Firebase/CoreOnly (8.9.0): + - FirebaseCore (= 8.9.0) + - Firebase/Messaging (8.9.0): - Firebase/CoreOnly - - FirebaseFirestore (~> 1.18.0) - - Firebase/Messaging (6.33.0): - - Firebase/CoreOnly - - FirebaseMessaging (~> 4.7.0) - - firebase_analytics (6.3.0): - - Firebase/Analytics (~> 6.33.0) - - Firebase/CoreOnly (~> 6.33.0) + - FirebaseMessaging (~> 8.9.0) + - firebase_analytics (8.3.4): + - Firebase/Analytics (= 8.9.0) - firebase_core - Flutter - - firebase_analytics_web (0.1.0): - - Flutter - - firebase_core (0.5.3): - - Firebase/CoreOnly (~> 6.33.0) + - firebase_core (1.10.0): + - Firebase/CoreOnly (= 8.9.0) - Flutter - - firebase_core_web (0.1.0): - - Flutter - - firebase_messaging (7.0.3): - - Firebase/CoreOnly (~> 6.33.0) - - Firebase/Messaging (~> 6.33.0) + - firebase_messaging (11.1.0): + - Firebase/Messaging (= 8.9.0) - firebase_core - Flutter - - FirebaseAnalytics (6.8.3): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.6) - - GoogleAppMeasurement (= 6.8.3) - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - FirebaseCore (6.10.3): - - FirebaseCoreDiagnostics (~> 1.6) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - FirebaseCoreDiagnostics (1.7.0): - - GoogleDataTransport (~> 7.4) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Logger (~> 6.7) - - nanopb (~> 1.30906.0) - - FirebaseFirestore (1.18.0): - - abseil/algorithm (= 0.20200225.0) - - abseil/base (= 0.20200225.0) - - abseil/memory (= 0.20200225.0) - - abseil/meta (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/time (= 0.20200225.0) - - abseil/types (= 0.20200225.0) - - FirebaseCore (~> 6.10) - - "gRPC-C++ (~> 1.28.0)" - - leveldb-library (~> 1.22) - - nanopb (~> 1.30906.0) - - FirebaseInstallations (1.7.0): - - FirebaseCore (~> 6.10) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - PromisesObjC (~> 1.2) - - FirebaseInstanceID (4.8.0): - - FirebaseCore (~> 6.10) - - FirebaseInstallations (~> 1.6) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - FirebaseMessaging (4.7.1): - - FirebaseCore (~> 6.10) - - FirebaseInstanceID (~> 4.7) - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/Environment (~> 6.7) - - GoogleUtilities/Reachability (~> 6.7) - - GoogleUtilities/UserDefaults (~> 6.7) - - Protobuf (>= 3.9.2, ~> 3.9) - - Flutter (1.0.0) - - flutter_email_sender (0.0.1): + - FirebaseAnalytics (8.9.1): + - FirebaseAnalytics/AdIdSupport (= 8.9.1) + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/MethodSwizzler (~> 7.6) + - GoogleUtilities/Network (~> 7.6) + - "GoogleUtilities/NSData+zlib (~> 7.6)" + - nanopb (~> 2.30908.0) + - FirebaseAnalytics/AdIdSupport (8.9.1): + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleAppMeasurement (= 8.9.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/MethodSwizzler (~> 7.6) + - GoogleUtilities/Network (~> 7.6) + - "GoogleUtilities/NSData+zlib (~> 7.6)" + - nanopb (~> 2.30908.0) + - FirebaseCore (8.9.0): + - FirebaseCoreDiagnostics (~> 8.0) + - GoogleUtilities/Environment (~> 7.6) + - GoogleUtilities/Logger (~> 7.6) + - FirebaseCoreDiagnostics (8.10.0): + - GoogleDataTransport (~> 9.1) + - GoogleUtilities/Environment (~> 7.6) + - GoogleUtilities/Logger (~> 7.6) + - nanopb (~> 2.30908.0) + - FirebaseInstallations (8.10.0): + - FirebaseCore (~> 8.0) + - GoogleUtilities/Environment (~> 7.6) + - GoogleUtilities/UserDefaults (~> 7.6) + - PromisesObjC (< 3.0, >= 1.2) + - FirebaseMessaging (8.9.0): + - FirebaseCore (~> 8.0) + - FirebaseInstallations (~> 8.0) + - GoogleDataTransport (~> 9.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/Environment (~> 7.6) + - GoogleUtilities/Reachability (~> 7.6) + - GoogleUtilities/UserDefaults (~> 7.6) + - nanopb (~> 2.30908.0) + - fit_kit (0.0.1): - Flutter + - Flutter (1.0.0) - flutter_flexible_toast (0.0.1): - Flutter - flutter_hms_gms_availability (0.0.1): - Flutter - flutter_inappwebview (0.0.1): - Flutter - - flutter_local_notifications (0.0.1): + - flutter_inappwebview/Core (= 0.0.1) + - OrderedSet (~> 5.0) + - flutter_inappwebview/Core (0.0.1): - Flutter - - flutter_plugin_android_lifecycle (0.0.1): + - OrderedSet (~> 5.0) + - flutter_local_notifications (0.0.1): - Flutter - flutter_tts (0.0.1): - Flutter - - flutter_webrtc (0.2.2): + - flutter_webrtc (0.7.1): - Flutter - - GoogleWebRTC (= 1.1.31999) - Libyuv (= 1703) + - WebRTC-SDK (= 92.4515.11) - FMDB (2.7.5): - FMDB/standard (= 2.7.5) - FMDB/standard (2.7.5) - - geolocator (6.2.0): + - geolocator_apple (1.2.0): - Flutter - google_maps_flutter (0.0.1): - Flutter - - GoogleMaps (< 3.10) - - GoogleAppMeasurement (6.8.3): - - GoogleUtilities/AppDelegateSwizzler (~> 6.7) - - GoogleUtilities/MethodSwizzler (~> 6.7) - - GoogleUtilities/Network (~> 6.7) - - "GoogleUtilities/NSData+zlib (~> 6.7)" - - nanopb (~> 1.30906.0) - - GoogleDataTransport (7.5.1): - - nanopb (~> 1.30906.0) - - GoogleMaps (3.9.0): - - GoogleMaps/Maps (= 3.9.0) - - GoogleMaps/Base (3.9.0) - - GoogleMaps/Maps (3.9.0): + - GoogleMaps + - GoogleAppMeasurement (8.9.1): + - GoogleAppMeasurement/AdIdSupport (= 8.9.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/MethodSwizzler (~> 7.6) + - GoogleUtilities/Network (~> 7.6) + - "GoogleUtilities/NSData+zlib (~> 7.6)" + - nanopb (~> 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (8.9.1): + - GoogleAppMeasurement/WithoutAdIdSupport (= 8.9.1) + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/MethodSwizzler (~> 7.6) + - GoogleUtilities/Network (~> 7.6) + - "GoogleUtilities/NSData+zlib (~> 7.6)" + - nanopb (~> 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (8.9.1): + - GoogleUtilities/AppDelegateSwizzler (~> 7.6) + - GoogleUtilities/MethodSwizzler (~> 7.6) + - GoogleUtilities/Network (~> 7.6) + - "GoogleUtilities/NSData+zlib (~> 7.6)" + - nanopb (~> 2.30908.0) + - GoogleDataTransport (9.1.2): + - GoogleUtilities/Environment (~> 7.2) + - nanopb (~> 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleMaps (5.2.0): + - GoogleMaps/Maps (= 5.2.0) + - GoogleMaps/Base (5.2.0) + - GoogleMaps/Maps (5.2.0): - GoogleMaps/Base - - GoogleUtilities/AppDelegateSwizzler (6.7.2): + - GoogleUtilities/AppDelegateSwizzler (7.6.0): - GoogleUtilities/Environment - GoogleUtilities/Logger - GoogleUtilities/Network - - GoogleUtilities/Environment (6.7.2): - - PromisesObjC (~> 1.2) - - GoogleUtilities/Logger (6.7.2): + - GoogleUtilities/Environment (7.6.0): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.6.0): - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (6.7.2): + - GoogleUtilities/MethodSwizzler (7.6.0): - GoogleUtilities/Logger - - GoogleUtilities/Network (6.7.2): + - GoogleUtilities/Network (7.6.0): - GoogleUtilities/Logger - "GoogleUtilities/NSData+zlib" - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (6.7.2)" - - GoogleUtilities/Reachability (6.7.2): + - "GoogleUtilities/NSData+zlib (7.6.0)" + - GoogleUtilities/Reachability (7.6.0): - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (6.7.2): + - GoogleUtilities/UserDefaults (7.6.0): - GoogleUtilities/Logger - - GoogleWebRTC (1.1.31999) - - "gRPC-C++ (1.28.2)": - - "gRPC-C++/Implementation (= 1.28.2)" - - "gRPC-C++/Interface (= 1.28.2)" - - "gRPC-C++/Implementation (1.28.2)": - - abseil/container/inlined_vector (= 0.20200225.0) - - abseil/memory/memory (= 0.20200225.0) - - abseil/strings/str_format (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - "gRPC-C++/Interface (= 1.28.2)" - - gRPC-Core (= 1.28.2) - - "gRPC-C++/Interface (1.28.2)" - - gRPC-Core (1.28.2): - - gRPC-Core/Implementation (= 1.28.2) - - gRPC-Core/Interface (= 1.28.2) - - gRPC-Core/Implementation (1.28.2): - - abseil/container/inlined_vector (= 0.20200225.0) - - abseil/memory/memory (= 0.20200225.0) - - abseil/strings/str_format (= 0.20200225.0) - - abseil/strings/strings (= 0.20200225.0) - - abseil/types/optional (= 0.20200225.0) - - BoringSSL-GRPC (= 0.0.7) - - gRPC-Core/Interface (= 1.28.2) - - gRPC-Core/Interface (1.28.2) - - hexcolor (0.0.1): - - Flutter - - "huawei_location (5.0.0+301)": - - Flutter - - "huawei_map (5.0.3+303)": - - Flutter - - image_cropper (0.0.3): - - Flutter - - TOCropViewController (~> 2.5.4) - image_picker (0.0.1): - Flutter - in_app_review (0.2.0): - Flutter - - in_app_update (0.0.1): - - Flutter - just_audio (0.0.1): - Flutter - - leveldb-library (1.22) - Libyuv (1703) - local_auth (0.0.1): - Flutter @@ -464,53 +198,35 @@ PODS: - Flutter - manage_calendar_events (0.0.1): - Flutter - - map_launcher (0.0.1): - - Flutter - maps_launcher (0.0.1): - Flutter - MTBBarcodeScanner (5.0.11) - - nanopb (1.30906.0): - - nanopb/decode (= 1.30906.0) - - nanopb/encode (= 1.30906.0) - - nanopb/decode (1.30906.0) - - nanopb/encode (1.30906.0) + - nanopb (2.30908.0): + - nanopb/decode (= 2.30908.0) + - nanopb/encode (= 2.30908.0) + - nanopb/decode (2.30908.0) + - nanopb/encode (2.30908.0) - native_device_orientation (0.0.1): - Flutter - nfc_in_flutter (1.0.0): - Flutter - - NVActivityIndicatorView (5.1.1): - - NVActivityIndicatorView/Base (= 5.1.1) - - NVActivityIndicatorView/Base (5.1.1) - - OpenTok (2.20.0) - - path_provider (0.0.1): - - Flutter - - path_provider_linux (0.0.1): + - OrderedSet (5.0.0) + - package_info_plus (0.4.5): - Flutter - - path_provider_macos (0.0.1): - - Flutter - - path_provider_windows (0.0.1): + - path_provider_ios (0.0.1): - Flutter - "permission_handler (5.1.0+2)": - Flutter - - PromisesObjC (1.2.11) - - Protobuf (3.13.0) + - PromisesObjC (2.0.0) - Reachability (3.2) - screen (0.0.1): - Flutter - - SDWebImage (5.10.4): - - SDWebImage/Core (= 5.10.4) - - SDWebImage/Core (5.10.4) - - shared_preferences (0.0.1): - - Flutter - - shared_preferences_linux (0.0.1): - - Flutter - - shared_preferences_macos (0.0.1): - - Flutter - - shared_preferences_web (0.0.1): - - Flutter - - shared_preferences_windows (0.0.1): + - SDWebImage (5.12.1): + - SDWebImage/Core (= 5.12.1) + - SDWebImage/Core (5.12.1) + - searchable_dropdown (1.1.1): - Flutter - - sms_otp_auto_verify (0.0.1): + - shared_preferences_ios (0.0.1): - Flutter - speech_to_text (0.0.1): - Flutter @@ -518,185 +234,115 @@ PODS: - sqflite (0.0.2): - Flutter - FMDB (>= 2.7.5) - - SwiftyGif (5.4.0) - - TOCropViewController (2.5.5) + - SwiftyGif (5.4.1) - Try (2.1.1) - - "twilio_programmable_video (0.6.4+1)": - - Flutter - - TwilioVideo (~> 3.7) - - TwilioVideo (3.8.0) - - url_launcher (0.0.1): - - Flutter - - url_launcher_linux (0.0.1): - - Flutter - - url_launcher_macos (0.0.1): - - Flutter - - url_launcher_web (0.0.1): - - Flutter - - url_launcher_windows (0.0.1): + - url_launcher_ios (0.0.1): - Flutter - vibration (1.7.3): - Flutter - - vibration_web (1.6.2): - - Flutter - video_player (0.0.1): - Flutter - - video_player_web (0.0.1): - - Flutter - wakelock (0.0.1): - Flutter - - webview_flutter (0.0.1): + - WebRTC-SDK (92.4515.11) + - webview_flutter_wkwebview (0.0.1): - Flutter - wifi (0.0.1): - Flutter DEPENDENCIES: - - android_intent (from `.symlinks/plugins/android_intent/ios`) + - audio_session (from `.symlinks/plugins/audio_session/ios`) - barcode_scan_fix (from `.symlinks/plugins/barcode_scan_fix/ios`) - - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) - - cloud_firestore_web (from `.symlinks/plugins/cloud_firestore_web/ios`) + - camera (from `.symlinks/plugins/camera/ios`) - connectivity (from `.symlinks/plugins/connectivity/ios`) - - connectivity_for_web (from `.symlinks/plugins/connectivity_for_web/ios`) - - connectivity_macos (from `.symlinks/plugins/connectivity_macos/ios`) - device_calendar (from `.symlinks/plugins/device_calendar/ios`) - - device_info (from `.symlinks/plugins/device_info/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) - - file_picker_web (from `.symlinks/plugins/file_picker_web/ios`) - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) - - firebase_analytics_web (from `.symlinks/plugins/firebase_analytics_web/ios`) - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - firebase_core_web (from `.symlinks/plugins/firebase_core_web/ios`) - firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`) + - fit_kit (from `.symlinks/plugins/fit_kit/ios`) - Flutter (from `Flutter`) - - flutter_email_sender (from `.symlinks/plugins/flutter_email_sender/ios`) - flutter_flexible_toast (from `.symlinks/plugins/flutter_flexible_toast/ios`) - flutter_hms_gms_availability (from `.symlinks/plugins/flutter_hms_gms_availability/ios`) - flutter_inappwebview (from `.symlinks/plugins/flutter_inappwebview/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - - flutter_plugin_android_lifecycle (from `.symlinks/plugins/flutter_plugin_android_lifecycle/ios`) - flutter_tts (from `.symlinks/plugins/flutter_tts/ios`) - flutter_webrtc (from `.symlinks/plugins/flutter_webrtc/ios`) - - geolocator (from `.symlinks/plugins/geolocator/ios`) + - geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`) - google_maps_flutter (from `.symlinks/plugins/google_maps_flutter/ios`) - - hexcolor (from `.symlinks/plugins/hexcolor/ios`) - - huawei_location (from `.symlinks/plugins/huawei_location/ios`) - - huawei_map (from `.symlinks/plugins/huawei_map/ios`) - - image_cropper (from `.symlinks/plugins/image_cropper/ios`) - image_picker (from `.symlinks/plugins/image_picker/ios`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - - in_app_update (from `.symlinks/plugins/in_app_update/ios`) - just_audio (from `.symlinks/plugins/just_audio/ios`) - local_auth (from `.symlinks/plugins/local_auth/ios`) - location (from `.symlinks/plugins/location/ios`) - manage_calendar_events (from `.symlinks/plugins/manage_calendar_events/ios`) - - map_launcher (from `.symlinks/plugins/map_launcher/ios`) - maps_launcher (from `.symlinks/plugins/maps_launcher/ios`) - native_device_orientation (from `.symlinks/plugins/native_device_orientation/ios`) - nfc_in_flutter (from `.symlinks/plugins/nfc_in_flutter/ios`) - - NVActivityIndicatorView - - OpenTok - - path_provider (from `.symlinks/plugins/path_provider/ios`) - - path_provider_linux (from `.symlinks/plugins/path_provider_linux/ios`) - - path_provider_macos (from `.symlinks/plugins/path_provider_macos/ios`) - - path_provider_windows (from `.symlinks/plugins/path_provider_windows/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`) - screen (from `.symlinks/plugins/screen/ios`) - - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) - - shared_preferences_linux (from `.symlinks/plugins/shared_preferences_linux/ios`) - - shared_preferences_macos (from `.symlinks/plugins/shared_preferences_macos/ios`) - - shared_preferences_web (from `.symlinks/plugins/shared_preferences_web/ios`) - - shared_preferences_windows (from `.symlinks/plugins/shared_preferences_windows/ios`) - - sms_otp_auto_verify (from `.symlinks/plugins/sms_otp_auto_verify/ios`) + - searchable_dropdown (from `.symlinks/plugins/searchable_dropdown/ios`) + - shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`) - speech_to_text (from `.symlinks/plugins/speech_to_text/ios`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - - twilio_programmable_video (from `.symlinks/plugins/twilio_programmable_video/ios`) - - url_launcher (from `.symlinks/plugins/url_launcher/ios`) - - url_launcher_linux (from `.symlinks/plugins/url_launcher_linux/ios`) - - url_launcher_macos (from `.symlinks/plugins/url_launcher_macos/ios`) - - url_launcher_web (from `.symlinks/plugins/url_launcher_web/ios`) - - url_launcher_windows (from `.symlinks/plugins/url_launcher_windows/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - vibration (from `.symlinks/plugins/vibration/ios`) - - vibration_web (from `.symlinks/plugins/vibration_web/ios`) - video_player (from `.symlinks/plugins/video_player/ios`) - - video_player_web (from `.symlinks/plugins/video_player_web/ios`) - wakelock (from `.symlinks/plugins/wakelock/ios`) - - webview_flutter (from `.symlinks/plugins/webview_flutter/ios`) + - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`) - wifi (from `.symlinks/plugins/wifi/ios`) SPEC REPOS: trunk: - - abseil - - BoringSSL-GRPC - DKImagePickerController - DKPhotoGallery - Firebase - FirebaseAnalytics - FirebaseCore - FirebaseCoreDiagnostics - - FirebaseFirestore - FirebaseInstallations - - FirebaseInstanceID - FirebaseMessaging - FMDB - GoogleAppMeasurement - GoogleDataTransport - GoogleMaps - GoogleUtilities - - GoogleWebRTC - - "gRPC-C++" - - gRPC-Core - - leveldb-library - Libyuv - MTBBarcodeScanner - nanopb - - NVActivityIndicatorView - - OpenTok + - OrderedSet - PromisesObjC - - Protobuf - Reachability - SDWebImage - SwiftyGif - - TOCropViewController - Try - - TwilioVideo + - WebRTC-SDK EXTERNAL SOURCES: - android_intent: - :path: ".symlinks/plugins/android_intent/ios" + audio_session: + :path: ".symlinks/plugins/audio_session/ios" barcode_scan_fix: :path: ".symlinks/plugins/barcode_scan_fix/ios" - cloud_firestore: - :path: ".symlinks/plugins/cloud_firestore/ios" - cloud_firestore_web: - :path: ".symlinks/plugins/cloud_firestore_web/ios" + camera: + :path: ".symlinks/plugins/camera/ios" connectivity: :path: ".symlinks/plugins/connectivity/ios" - connectivity_for_web: - :path: ".symlinks/plugins/connectivity_for_web/ios" - connectivity_macos: - :path: ".symlinks/plugins/connectivity_macos/ios" device_calendar: :path: ".symlinks/plugins/device_calendar/ios" - device_info: - :path: ".symlinks/plugins/device_info/ios" file_picker: :path: ".symlinks/plugins/file_picker/ios" - file_picker_web: - :path: ".symlinks/plugins/file_picker_web/ios" firebase_analytics: :path: ".symlinks/plugins/firebase_analytics/ios" - firebase_analytics_web: - :path: ".symlinks/plugins/firebase_analytics_web/ios" firebase_core: :path: ".symlinks/plugins/firebase_core/ios" - firebase_core_web: - :path: ".symlinks/plugins/firebase_core_web/ios" firebase_messaging: :path: ".symlinks/plugins/firebase_messaging/ios" + fit_kit: + :path: ".symlinks/plugins/fit_kit/ios" Flutter: :path: Flutter - flutter_email_sender: - :path: ".symlinks/plugins/flutter_email_sender/ios" flutter_flexible_toast: :path: ".symlinks/plugins/flutter_flexible_toast/ios" flutter_hms_gms_availability: @@ -705,30 +351,18 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/flutter_inappwebview/ios" flutter_local_notifications: :path: ".symlinks/plugins/flutter_local_notifications/ios" - flutter_plugin_android_lifecycle: - :path: ".symlinks/plugins/flutter_plugin_android_lifecycle/ios" flutter_tts: :path: ".symlinks/plugins/flutter_tts/ios" flutter_webrtc: :path: ".symlinks/plugins/flutter_webrtc/ios" - geolocator: - :path: ".symlinks/plugins/geolocator/ios" + geolocator_apple: + :path: ".symlinks/plugins/geolocator_apple/ios" google_maps_flutter: :path: ".symlinks/plugins/google_maps_flutter/ios" - hexcolor: - :path: ".symlinks/plugins/hexcolor/ios" - huawei_location: - :path: ".symlinks/plugins/huawei_location/ios" - huawei_map: - :path: ".symlinks/plugins/huawei_map/ios" - image_cropper: - :path: ".symlinks/plugins/image_cropper/ios" image_picker: :path: ".symlinks/plugins/image_picker/ios" in_app_review: :path: ".symlinks/plugins/in_app_review/ios" - in_app_update: - :path: ".symlinks/plugins/in_app_update/ios" just_audio: :path: ".symlinks/plugins/just_audio/ios" local_auth: @@ -737,174 +371,108 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/location/ios" manage_calendar_events: :path: ".symlinks/plugins/manage_calendar_events/ios" - map_launcher: - :path: ".symlinks/plugins/map_launcher/ios" maps_launcher: :path: ".symlinks/plugins/maps_launcher/ios" native_device_orientation: :path: ".symlinks/plugins/native_device_orientation/ios" nfc_in_flutter: :path: ".symlinks/plugins/nfc_in_flutter/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - path_provider_linux: - :path: ".symlinks/plugins/path_provider_linux/ios" - path_provider_macos: - :path: ".symlinks/plugins/path_provider_macos/ios" - path_provider_windows: - :path: ".symlinks/plugins/path_provider_windows/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" permission_handler: :path: ".symlinks/plugins/permission_handler/ios" screen: :path: ".symlinks/plugins/screen/ios" - shared_preferences: - :path: ".symlinks/plugins/shared_preferences/ios" - shared_preferences_linux: - :path: ".symlinks/plugins/shared_preferences_linux/ios" - shared_preferences_macos: - :path: ".symlinks/plugins/shared_preferences_macos/ios" - shared_preferences_web: - :path: ".symlinks/plugins/shared_preferences_web/ios" - shared_preferences_windows: - :path: ".symlinks/plugins/shared_preferences_windows/ios" - sms_otp_auto_verify: - :path: ".symlinks/plugins/sms_otp_auto_verify/ios" + searchable_dropdown: + :path: ".symlinks/plugins/searchable_dropdown/ios" + shared_preferences_ios: + :path: ".symlinks/plugins/shared_preferences_ios/ios" speech_to_text: :path: ".symlinks/plugins/speech_to_text/ios" sqflite: :path: ".symlinks/plugins/sqflite/ios" - twilio_programmable_video: - :path: ".symlinks/plugins/twilio_programmable_video/ios" - url_launcher: - :path: ".symlinks/plugins/url_launcher/ios" - url_launcher_linux: - :path: ".symlinks/plugins/url_launcher_linux/ios" - url_launcher_macos: - :path: ".symlinks/plugins/url_launcher_macos/ios" - url_launcher_web: - :path: ".symlinks/plugins/url_launcher_web/ios" - url_launcher_windows: - :path: ".symlinks/plugins/url_launcher_windows/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" vibration: :path: ".symlinks/plugins/vibration/ios" - vibration_web: - :path: ".symlinks/plugins/vibration_web/ios" video_player: :path: ".symlinks/plugins/video_player/ios" - video_player_web: - :path: ".symlinks/plugins/video_player_web/ios" wakelock: :path: ".symlinks/plugins/wakelock/ios" - webview_flutter: - :path: ".symlinks/plugins/webview_flutter/ios" + webview_flutter_wkwebview: + :path: ".symlinks/plugins/webview_flutter_wkwebview/ios" wifi: :path: ".symlinks/plugins/wifi/ios" SPEC CHECKSUMS: - abseil: 6c8eb7892aefa08d929b39f9bb108e5367e3228f - android_intent: 367df2f1277a74e4a90e14a8ab3df3112d087052 + audio_session: 4f3e461722055d21515cf3261b64c973c062f345 barcode_scan_fix: 80dd65de55f27eec6591dd077c8b85f2b79e31f1 - BoringSSL-GRPC: 8edf627ee524575e2f8d19d56f068b448eea3879 - cloud_firestore: b8c0e15fa49dfff87c2817d288b577e5dca2df13 - cloud_firestore_web: 9ec3dc7f5f98de5129339802d491c1204462bfec + camera: fe33292aff715a981eb34d7ce7b35b54337ff34c connectivity: c4130b2985d4ef6fd26f9702e886bd5260681467 - connectivity_for_web: 2b8584556930d4bd490d82b836bcf45067ce345b - connectivity_macos: e2e9731b6b22dda39eb1b128f6969d574460e191 device_calendar: 23b28a5f1ab3bf77e34542fb1167e1b8b29a98f5 - device_info: d7d233b645a32c40dfdc212de5cf646ca482f175 DKImagePickerController: b5eb7f7a388e4643264105d648d01f727110fc3d DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 file_picker: 3e6c3790de664ccf9b882732d9db5eaf6b8d4eb1 - file_picker_web: 37b10786e88885124fac99dc899866e78a132ef3 - Firebase: 8db6f2d1b2c5e2984efba4949a145875a8f65fe5 - firebase_analytics: 36a619088c46224900829f14f4daa71585693a6f - firebase_analytics_web: 7d539061ea4af07563a0e21044af89cab70efec0 - firebase_core: 5d6a02f3d85acd5f8321c2d6d62877626a670659 - firebase_core_web: d501d8b946b60c8af265428ce483b0fff5ad52d1 - firebase_messaging: 0aea2cd5885b65e19ede58ee3507f485c992cc75 - FirebaseAnalytics: 5dd088bd2e67bb9d13dbf792d1164ceaf3052193 - FirebaseCore: d889d9e12535b7f36ac8bfbf1713a0836a3012cd - FirebaseCoreDiagnostics: 770ac5958e1372ce67959ae4b4f31d8e127c3ac1 - FirebaseFirestore: adff4877869ca91a11250cc0989a6cd56bad163f - FirebaseInstallations: 466c7b4d1f58fe16707693091da253726a731ed2 - FirebaseInstanceID: bd3ffc24367f901a43c063b36c640b345a4a5dd1 - FirebaseMessaging: 5eca4ef173de76253352511aafef774caa1cba2a - Flutter: 0e3d915762c693b495b44d77113d4970485de6ec - flutter_email_sender: f787522d0e82f50e5766c1213dbffff22fdcf009 + Firebase: 13d8d96499e2635428d5bf0ec675df21f95d9a95 + firebase_analytics: 7a7528bb2abf4ca22cff7a57bbf909dcab73e13d + firebase_core: f770e033e790657b3505f04be4cb24c482912f11 + firebase_messaging: 0c8d1a1732487db7f332fb65232053e93201e2fb + FirebaseAnalytics: 4ab446ce08a3fe52e8a4303dd997cf26276bf968 + FirebaseCore: 599ee609343eaf4941bd188f85e3aa077ffe325b + FirebaseCoreDiagnostics: 56fb7216d87e0e6ec2feddefa9d8a392fe8b2c18 + FirebaseInstallations: 830327b45345ffc859eaa9c17bcd5ae893fd5425 + FirebaseMessaging: 82c4a48638f53f7b184f3cc9f6cd2cbe533ab316 + fit_kit: 7643191161673bcd32863ae3f10baed6ce55c7c0 + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a flutter_flexible_toast: 0547e740cae0c33bb7c51bcd931233f4584e1143 flutter_hms_gms_availability: babc50b18670e99780270bc18d9b17d0a07cd77e - flutter_inappwebview: 69dfbac46157b336ffbec19ca6dfd4638c7bf189 - flutter_local_notifications: 9e4738ce2471c5af910d961a6b7eadcf57c50186 - flutter_plugin_android_lifecycle: dc0b544e129eebb77a6bfb1239d4d1c673a60a35 + flutter_inappwebview: bfd58618f49dc62f2676de690fc6dcda1d6c3721 + flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_tts: 0f492aab6accf87059b72354fcb4ba934304771d - flutter_webrtc: 39898454258b54ba51996850d5da8d5d53bf1524 + flutter_webrtc: a5a79904f0bca0ea23aff49c51ca765f70a0f703 FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a - geolocator: f5e3de65e241caba7ce3e8a618803387bda73384 - google_maps_flutter: c7f9c73576de1fbe152a227bfd6e6c4ae8088619 - GoogleAppMeasurement: 966e88df9d19c15715137bb2ddaf52373f111436 - GoogleDataTransport: f56af7caa4ed338dc8e138a5d7c5973e66440833 - GoogleMaps: 4b5346bddfe6911bb89155d43c903020170523ac - GoogleUtilities: 7f2f5a07f888cdb145101d6042bc4422f57e70b3 - GoogleWebRTC: b39a78c4f5cc6b0323415b9233db03a2faa7b0f0 - "gRPC-C++": 13d8ccef97d5c3c441b7e3c529ef28ebee86fad2 - gRPC-Core: 4afa11bfbedf7cdecd04de535a9e046893404ed5 - hexcolor: fdfb9c4258ad96e949c2dbcdf790a62194b8aa89 - huawei_location: a1c3d2a029138b3d0b9a72ce910ffae3ff23c1aa - huawei_map: 34fbad9c274ea78a4151487c9ebe27f1887777e7 - image_cropper: c8f9b4157933c7bb965a66d1c5e6c8fd408c6eb4 - image_picker: 9c3312491f862b28d21ecd8fdf0ee14e601b3f09 + geolocator_apple: b741765c55dc21950e3e106e8b3584e55cf81ce5 + google_maps_flutter: abdb8dee6c52d4be36ad131ee6ebfacd14417c5a + GoogleAppMeasurement: 837649ad3987936c232f6717c5680216f6243d24 + GoogleDataTransport: 629c20a4d363167143f30ea78320d5a7eb8bd940 + GoogleMaps: 025272d5876d3b32604e5c080dc25eaf68764693 + GoogleUtilities: 684ee790a24f73ebb2d1d966e9711c203f2a4237 + image_picker: 9aa50e1d8cdacdbed739e925b7eea16d014367e6 in_app_review: 4a97249f7a2f539a0f294c2d9196b7fe35e49541 - in_app_update: 16e877e205f4360264cb536e3a6481f0d90299e1 just_audio: baa7252489dbcf47a4c7cc9ca663e9661c99aafa - leveldb-library: 55d93ee664b4007aac644a782d11da33fba316f7 Libyuv: 5f79ced0ee66e60a612ca97de1e6ccacd187a437 - local_auth: 25938960984c3a7f6e3253e3f8d962fdd16852bd + local_auth: ef62030a2731330b95df7ef1331bd15f6a64b8a6 location: 3a2eed4dd2fab25e7b7baf2a9efefe82b512d740 manage_calendar_events: 0338d505ea26cdfd20cd883279bc28afa11eca34 - map_launcher: e325db1261d029ff33e08e03baccffe09593ffea - maps_launcher: eae38ee13a9c3f210fa04e04bb4c073fa4c6ed92 + maps_launcher: 2e5b6a2d664ec6c27f82ffa81b74228d770ab203 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb - nanopb: 59317e09cf1f1a0af72f12af412d54edf52603fc - native_device_orientation: e24d00be281de72996640885d80e706142707660 + nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 + native_device_orientation: 3b4cfc9565a7b879cc4fde282b3e27745e852d0d nfc_in_flutter: c656fbfb1ec5b9d021da87b0c87629d62fd5264d - NVActivityIndicatorView: 1f6c5687f1171810aa27a3296814dc2d7dec3667 - OpenTok: 414c2c1dc6486f1897015e4d1703558d5eed48c3 - path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c - path_provider_linux: 4d630dc393e1f20364f3e3b4a2ff41d9674a84e4 - path_provider_macos: f760a3c5b04357c380e2fddb6f9db6f3015897e0 - path_provider_windows: a2b81600c677ac1959367280991971cb9a1edb3b + OrderedSet: aaeb196f7fef5a9edf55d89760da9176ad40b93c + package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 - PromisesObjC: 8c196f5a328c2cba3e74624585467a557dcb482f - Protobuf: 3dac39b34a08151c6d949560efe3f86134a3f748 + PromisesObjC: 68159ce6952d93e17b2dfe273b8c40907db5ba58 Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 screen: abd91ca7bf3426e1cc3646d27e9b2358d6bf07b0 - SDWebImage: c666b97e1fa9c64b4909816a903322018f0a9c84 - shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d - shared_preferences_linux: afefbfe8d921e207f01ede8b60373d9e3b566b78 - shared_preferences_macos: f3f29b71ccbb56bf40c9dd6396c9acf15e214087 - shared_preferences_web: 141cce0c3ed1a1c5bf2a0e44f52d31eeb66e5ea9 - shared_preferences_windows: 36b76d6f54e76ead957e60b49e2f124b4cd3e6ae - sms_otp_auto_verify: 201803ac25e13feedaae96eda8b70b10c55b3338 + SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b + searchable_dropdown: 5058be32fdc5e0481d300ff2087129072e71bd62 + shared_preferences_ios: aef470a42dc4675a1cdd50e3158b42e3d1232b32 speech_to_text: b43a7d99aef037bd758ed8e45d79bbac035d2dfe sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 - SwiftyGif: 5d4af95df24caf1c570dbbcb32a3b8a0763bc6d7 - TOCropViewController: da59f531f8ac8a94ef6d6c0fc34009350f9e8bfe + SwiftyGif: 6895c887f5551618a3c5dd3ecb512419105bacca Try: 5ef669ae832617b3cee58cb2c6f99fb767a4ff96 - twilio_programmable_video: ce33772ea8275b413c0ab5c5aa2e35f9da2d4066 - TwilioVideo: c13a51ceca375e91620eb7578d2573c90cf53b46 - url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef - url_launcher_linux: ac237cb7a8058736e4aae38bdbcc748a4b394cc0 - url_launcher_macos: fd7894421cd39320dce5f292fc99ea9270b2a313 - url_launcher_web: e5527357f037c87560776e36436bf2b0288b965c - url_launcher_windows: 683d7c283894db8d1914d3ab2223b20cc1ad95d5 + url_launcher_ios: 02f1989d4e14e998335b02b67a7590fa34f971af vibration: b5a33e764c3f609a975b9dca73dce20fdde627dc - vibration_web: 0ba303d92469ba34d71c612a228b315908d7fcd9 - video_player: 9cc823b1d9da7e8427ee591e8438bfbcde500e6e - video_player_web: da8cadb8274ed4f8dbee8d7171b420dedd437ce7 - wakelock: 0d4a70faf8950410735e3f61fb15d517c8a6efc4 - webview_flutter: d2b4d6c66968ad042ad94cbb791f5b72b4678a96 + video_player: ecd305f42e9044793efd34846e1ce64c31ea6fcb + wakelock: d0fc7c864128eac40eba1617cb5264d9c940b46f + WebRTC-SDK: 21dbc6028a68f3a89718057a2caa970a4da8ebb7 + webview_flutter_wkwebview: 005fbd90c888a42c5690919a1527ecc6649e1162 wifi: d7d77c94109e36c4175d845f0a5964eadba71060 -PODFILE CHECKSUM: df22e8ed6009dd48559053927dc365d6dad6c11f +PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c -COCOAPODS: 1.10.1 +COCOAPODS: 1.11.2 diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 1d526a16..919434a6 100644 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index 35a3c022..8826bbdd 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -29,12 +29,12 @@ var userNotificationCenterDelegate:UNUserNotificationCenterDelegate? = nil if let mainViewController = window.rootViewController as? MainFlutterVC{ // platform initialization suppose to be in foreground flutterViewController = mainViewController HMGPlatformBridge.initialize(flutterViewController: flutterViewController) - OpenTokPlatformBridge.initialize(flutterViewController: flutterViewController, registrar: self.registrar(forPlugin: "open-tok")) +// OpenTokPlatformBridge.initialize(flutterViewController: flutterViewController, registrar: self.registrar(forPlugin: "open-tok")) }else if let mainViewController = initialViewController(){ // platform initialization suppose to be in background flutterViewController = mainViewController HMGPlatformBridge.initialize(flutterViewController: flutterViewController) - OpenTokPlatformBridge.initialize(flutterViewController: flutterViewController, registrar: self.registrar(forPlugin: "open-tok")) +// OpenTokPlatformBridge.initialize(flutterViewController: flutterViewController, registrar: self.registrar(forPlugin: "open-tok")) } } diff --git a/ios/Runner/Helper/OpenTokPlatformBridge.swift b/ios/Runner/Helper/OpenTokPlatformBridge.swift index 38e826e1..132f1384 100644 --- a/ios/Runner/Helper/OpenTokPlatformBridge.swift +++ b/ios/Runner/Helper/OpenTokPlatformBridge.swift @@ -8,52 +8,51 @@ import UIKit import NetworkExtension import SystemConfiguration.CaptiveNetwork -import OpenTok fileprivate var openTok:OpenTok? class OpenTokPlatformBridge : NSObject{ - private var methodChannel:FlutterMethodChannel? = nil - private var mainViewController:MainFlutterVC! - private static var shared_:OpenTokPlatformBridge? - - class func initialize(flutterViewController:MainFlutterVC, registrar:FlutterPluginRegistrar?){ - shared_ = OpenTokPlatformBridge() - shared_?.mainViewController = flutterViewController - - shared_?.openChannel() - openTok = OpenTok(mainViewController: flutterViewController, registrar: registrar) - } - - func shared() -> OpenTokPlatformBridge{ - assert((OpenTokPlatformBridge.shared_ != nil), "OpenTokPlatformBridge is not initialized, call initialize(mainViewController:MainFlutterVC) function first.") - return OpenTokPlatformBridge.shared_! - } - - private func openChannel(){ - methodChannel = FlutterMethodChannel(name: "OpenTok-Platform-Bridge", binaryMessenger: mainViewController.binaryMessenger) - methodChannel?.setMethodCallHandler { (call, result) in - print("Called function \(call.method)") - - switch(call.method) { - case "initSession": - openTok?.initSession(call: call, result: result) - - case "swapCamera": - openTok?.swapCamera(call: call, result: result) - - case "toggleAudio": - openTok?.toggleAudio(call: call, result: result) - - case "toggleVideo": - openTok?.toggleVideo(call: call, result: result) - - default: - result(FlutterMethodNotImplemented) - } - - print("") - } - } +// private var methodChannel:FlutterMethodChannel? = nil +// private var mainViewController:MainFlutterVC! +// private static var shared_:OpenTokPlatformBridge? +// +// class func initialize(flutterViewController:MainFlutterVC, registrar:FlutterPluginRegistrar?){ +// shared_ = OpenTokPlatformBridge() +// shared_?.mainViewController = flutterViewController +// +// shared_?.openChannel() +// openTok = OpenTok(mainViewController: flutterViewController, registrar: registrar) +// } +// +// func shared() -> OpenTokPlatformBridge{ +// assert((OpenTokPlatformBridge.shared_ != nil), "OpenTokPlatformBridge is not initialized, call initialize(mainViewController:MainFlutterVC) function first.") +// return OpenTokPlatformBridge.shared_! +// } +// +// private func openChannel(){ +// methodChannel = FlutterMethodChannel(name: "OpenTok-Platform-Bridge", binaryMessenger: mainViewController.binaryMessenger) +// methodChannel?.setMethodCallHandler { (call, result) in +// print("Called function \(call.method)") +// +// switch(call.method) { +// case "initSession": +// openTok?.initSession(call: call, result: result) +// +// case "swapCamera": +// openTok?.swapCamera(call: call, result: result) +// +// case "toggleAudio": +// openTok?.toggleAudio(call: call, result: result) +// +// case "toggleVideo": +// openTok?.toggleVideo(call: call, result: result) +// +// default: +// result(FlutterMethodNotImplemented) +// } +// +// print("") +// } +// } } diff --git a/ios/Runner/OpenTok/OpenTok.swift b/ios/Runner/OpenTok/OpenTok.swift index 9cc0b79a..f91d83d5 100644 --- a/ios/Runner/OpenTok/OpenTok.swift +++ b/ios/Runner/OpenTok/OpenTok.swift @@ -6,7 +6,7 @@ // import Foundation -import OpenTok +//import OpenTok import UIKit enum SdkState: String { @@ -17,163 +17,164 @@ enum SdkState: String { } class OpenTok : NSObject{ - private var mainViewController:MainFlutterVC! - private var registrar:FlutterPluginRegistrar? - var methodChannel: FlutterMethodChannel? - init(mainViewController:MainFlutterVC, registrar:FlutterPluginRegistrar?){ - self.mainViewController = mainViewController - self.methodChannel = FlutterMethodChannel(name: "OpenTok-Platform-Bridge", binaryMessenger: mainViewController.binaryMessenger) - self.registrar = registrar - - let remoteVDOFactory = OpenTokRemoteVideoFactory(messenger: registrar!.messenger()) - registrar?.register(remoteVDOFactory, withId: "remote-video-container") - - let localVDOFactory = OpenTokLocalVideoFactory(messenger: registrar!.messenger()) - registrar?.register(localVDOFactory, withId: "local-video-container") - } - - var otSession: OTSession? - - var subscriber: OTSubscriber? - lazy var publisher: OTPublisher = { - let settings = OTPublisherSettings() - settings.name = UIDevice.current.name - return OTPublisher(delegate: self, settings: settings)! - }() - - func initSession(call:FlutterMethodCall, result: @escaping FlutterResult){ - if let arguments = call.arguments as? [String: String], - let apiKey = arguments["apiKey"], - let sessionId = arguments["sessionId"], - let token = arguments["token"]{ - - var error: OTError? - defer { - // todo - } - - notifyFlutter(state: SdkState.wait) - otSession = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self)! - otSession?.connect(withToken: token, error: &error) - - result("") - }else{ - - } - - } - - - func swapCamera(call:FlutterMethodCall, result: @escaping FlutterResult) { - if publisher.cameraPosition == .front { - publisher.cameraPosition = .back - } else { - publisher.cameraPosition = .front - } - result("") - } - - func toggleAudio(call:FlutterMethodCall, result: @escaping FlutterResult) { - if let arguments = call.arguments as? [String: Bool], - let publishAudio = arguments["publishAudio"] { - publisher.publishAudio = !publisher.publishAudio - } - result("") - } - - func toggleVideo(call:FlutterMethodCall, result: @escaping FlutterResult) { - if let arguments = call.arguments as? [String: Bool], - let publishVideo = arguments["publishVideo"] { - publisher.publishVideo = !publisher.publishVideo - } - result("") - } - - - func notifyFlutter(state: SdkState) { - methodChannel?.invokeMethod("updateState", arguments: state.rawValue) - } - -} - -extension OpenTok: OTSessionDelegate { - func sessionDidConnect(_ sessionDelegate: OTSession) { - print("The client connected to the session.") - notifyFlutter(state: SdkState.loggedIn) - - var error: OTError? - defer { - // todo - } - - self.otSession?.publish(self.publisher, error: &error) - - if let pubView = self.publisher.view { - pubView.frame = CGRect(x: 0, y: 0, width: 200, height: 300) - - if OpenTokLocalVideoFactory.view == nil { - OpenTokLocalVideoFactory.viewToAddPub = pubView - } else { - OpenTokLocalVideoFactory.view?.addPublisherView(pubView) - } - } - } - - func sessionDidDisconnect(_ session: OTSession) { - print("The client disconnected from the session.") - notifyFlutter(state: SdkState.loggedOut) - } - - func session(_ session: OTSession, didFailWithError error: OTError) { - print("The client failed to connect to the session: \(error).") - } - - func session(_ session: OTSession, streamCreated stream: OTStream) { - print("A stream was created in the session.") - var error: OTError? - defer { - // todo - } - subscriber = OTSubscriber(stream: stream, delegate: self) - - session.subscribe(subscriber!, error: &error) - } - - func session(_ session: OTSession, streamDestroyed stream: OTStream) { - print("A stream was destroyed in the session.") - } -} - -extension OpenTok: OTPublisherDelegate { - func publisher(_ publisher: OTPublisherKit, streamCreated stream: OTStream) { - } - - func publisher(_ publisher: OTPublisherKit, streamDestroyed stream: OTStream) { - } - - func publisher(_ publisher: OTPublisherKit, didFailWithError error: OTError) { - print("Publisher failed: \(error.localizedDescription)") - } -} - -extension OpenTok: OTSubscriberDelegate { - func subscriberDidConnect(toStream subscriberKit: OTSubscriberKit) { - print("Subscriber connected") - - if let subView = self.subscriber?.view { - subView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) - - if OpenTokRemoteVideoFactory.view == nil { - OpenTokRemoteVideoFactory.viewToAddSub = subView - } else { - OpenTokRemoteVideoFactory.view?.addSubscriberView(subView) - } - } - } - - func subscriber(_ subscriber: OTSubscriberKit, didFailWithError error: OTError) { - print("Subscriber failed: \(error.localizedDescription)") - } +// private var mainViewController:MainFlutterVC! +// private var registrar:FlutterPluginRegistrar? +// var methodChannel: FlutterMethodChannel? +// +// init(mainViewController:MainFlutterVC, registrar:FlutterPluginRegistrar?){ +// self.mainViewController = mainViewController +// self.methodChannel = FlutterMethodChannel(name: "OpenTok-Platform-Bridge", binaryMessenger: mainViewController.binaryMessenger) +// self.registrar = registrar +// +// let remoteVDOFactory = OpenTokRemoteVideoFactory(messenger: registrar!.messenger()) +// registrar?.register(remoteVDOFactory, withId: "remote-video-container") +// +// let localVDOFactory = OpenTokLocalVideoFactory(messenger: registrar!.messenger()) +// registrar?.register(localVDOFactory, withId: "local-video-container") +// } +// +// var otSession: OTSession? +// +// var subscriber: OTSubscriber? +// lazy var publisher: OTPublisher = { +// let settings = OTPublisherSettings() +// settings.name = UIDevice.current.name +// return OTPublisher(delegate: self, settings: settings)! +// }() +// +// func initSession(call:FlutterMethodCall, result: @escaping FlutterResult){ +// if let arguments = call.arguments as? [String: String], +// let apiKey = arguments["apiKey"], +// let sessionId = arguments["sessionId"], +// let token = arguments["token"]{ +// +// var error: OTError? +// defer { +// // todo +// } +// +// notifyFlutter(state: SdkState.wait) +// otSession = OTSession(apiKey: apiKey, sessionId: sessionId, delegate: self)! +// otSession?.connect(withToken: token, error: &error) +// +// result("") +// }else{ +// +// } +// +// } +// +// +// func swapCamera(call:FlutterMethodCall, result: @escaping FlutterResult) { +// if publisher.cameraPosition == .front { +// publisher.cameraPosition = .back +// } else { +// publisher.cameraPosition = .front +// } +// result("") +// } +// +// func toggleAudio(call:FlutterMethodCall, result: @escaping FlutterResult) { +// if let arguments = call.arguments as? [String: Bool], +// let publishAudio = arguments["publishAudio"] { +// publisher.publishAudio = !publisher.publishAudio +// } +// result("") +// } +// +// func toggleVideo(call:FlutterMethodCall, result: @escaping FlutterResult) { +// if let arguments = call.arguments as? [String: Bool], +// let publishVideo = arguments["publishVideo"] { +// publisher.publishVideo = !publisher.publishVideo +// } +// result("") +// } +// +// +// func notifyFlutter(state: SdkState) { +// methodChannel?.invokeMethod("updateState", arguments: state.rawValue) +// } +// +//} +// +//extension OpenTok: OTSessionDelegate { +// func sessionDidConnect(_ sessionDelegate: OTSession) { +// print("The client connected to the session.") +// notifyFlutter(state: SdkState.loggedIn) +// +// var error: OTError? +// defer { +// // todo +// } +// +// self.otSession?.publish(self.publisher, error: &error) +// +// if let pubView = self.publisher.view { +// pubView.frame = CGRect(x: 0, y: 0, width: 200, height: 300) +// +// if OpenTokLocalVideoFactory.view == nil { +// OpenTokLocalVideoFactory.viewToAddPub = pubView +// } else { +// OpenTokLocalVideoFactory.view?.addPublisherView(pubView) +// } +// } +// } +// +// func sessionDidDisconnect(_ session: OTSession) { +// print("The client disconnected from the session.") +// notifyFlutter(state: SdkState.loggedOut) +// } +// +// func session(_ session: OTSession, didFailWithError error: OTError) { +// print("The client failed to connect to the session: \(error).") +// } +// +// func session(_ session: OTSession, streamCreated stream: OTStream) { +// print("A stream was created in the session.") +// var error: OTError? +// defer { +// // todo +// } +// subscriber = OTSubscriber(stream: stream, delegate: self) +// +// session.subscribe(subscriber!, error: &error) +// } +// +// func session(_ session: OTSession, streamDestroyed stream: OTStream) { +// print("A stream was destroyed in the session.") +// } +//} +// +//extension OpenTok: OTPublisherDelegate { +// func publisher(_ publisher: OTPublisherKit, streamCreated stream: OTStream) { +// } +// +// func publisher(_ publisher: OTPublisherKit, streamDestroyed stream: OTStream) { +// } +// +// func publisher(_ publisher: OTPublisherKit, didFailWithError error: OTError) { +// print("Publisher failed: \(error.localizedDescription)") +// } +//} +// +//extension OpenTok: OTSubscriberDelegate { +// func subscriberDidConnect(toStream subscriberKit: OTSubscriberKit) { +// print("Subscriber connected") +// +// if let subView = self.subscriber?.view { +// subView.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) +// +// if OpenTokRemoteVideoFactory.view == nil { +// OpenTokRemoteVideoFactory.viewToAddSub = subView +// } else { +// OpenTokRemoteVideoFactory.view?.addSubscriberView(subView) +// } +// } +// } +// +// func subscriber(_ subscriber: OTSubscriberKit, didFailWithError error: OTError) { +// print("Subscriber failed: \(error.localizedDescription)") +// } } diff --git a/lib/main.dart b/lib/main.dart index 9bb465f8..a3175350 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,6 +9,7 @@ import 'package:diplomaticquarterapp/theme/theme_value.dart'; import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/PlatformBridge.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; +import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; @@ -25,14 +26,10 @@ import 'locator.dart'; import 'pages/pharmacies/compare-list.dart'; -Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { - await Firebase.initializeApp(); - print("Handling a background message: ${message.messageId}"); -} + void main() async { WidgetsFlutterBinding.ensureInitialized(); - // FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); await Firebase.initializeApp(); setupLocator(); runApp(MyApp()); @@ -74,6 +71,7 @@ class _MyApp extends State { @override Widget build(BuildContext context) { PlatformBridge.init(context); + PushNotificationHandler(context).init(); // Asyncronously LocalNotification.init(onNotificationClick: (payload) { LocalNotification.getInstance().showNow(title: "Payload", subtitle: payload, payload: payload); diff --git a/lib/pages/conference/web_rtc/call_home_page.dart b/lib/pages/conference/web_rtc/call_home_page.dart index 4af7b1de..dd841a6c 100644 --- a/lib/pages/conference/web_rtc/call_home_page.dart +++ b/lib/pages/conference/web_rtc/call_home_page.dart @@ -1,216 +1,61 @@ -import 'dart:async'; - -import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart'; -import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart'; -import 'package:diplomaticquarterapp/pages/webRTC/call_page.dart'; -import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart'; -import 'package:diplomaticquarterapp/uitl/SignalRUtil.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_webrtc/flutter_webrtc.dart'; - -import '../conference_button_bar.dart'; - -class CallHomePage extends StatefulWidget { - final String receiverId; - final String callerId; - - const CallHomePage({Key key, this.receiverId, this.callerId}) : super(key: key); - - @override - _CallHomePageState createState() => _CallHomePageState(); -} - -class _CallHomePageState extends State { - bool showNoise = false; - RTCVideoRenderer _localRenderer = RTCVideoRenderer(); - RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); - - final StreamController _audioButton = StreamController.broadcast(); - final StreamController _videoButton = StreamController.broadcast(); - final StreamController _onButtonBarVisibleStreamController = StreamController.broadcast(); - final StreamController _onButtonBarHeightStreamController = StreamController.broadcast(); - - //Stream to enable video - MediaStream localMediaStream; - MediaStream remoteMediaStream; - Signaling signaling = Signaling()..init(); - - @override - void initState() { - // TODO: implement initState - super.initState(); - startCall(); - } - - startCall() async{ - await _localRenderer.initialize(); - await _remoteRenderer.initialize(); - final connected = await receivedCall(); - } - - - Future receivedCall() async { - //Stream local media - localMediaStream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': true}); - _localRenderer.srcObject = localMediaStream; - - final connected = await signaling.acceptCall(widget.callerId, widget.receiverId, localMediaStream: localMediaStream, onRemoteMediaStream: (remoteMediaStream){ - this.remoteMediaStream = remoteMediaStream; - _remoteRenderer.srcObject = remoteMediaStream; - }); - - if(connected){ - signaling.signalR.listen( - onAcceptCall: (arg0){ - print(arg0.toString()); - }, - onCandidate: (candidateJson){ - signaling.addCandidate(candidateJson); - }, - onDeclineCall: (arg0,arg1){ - // _onHangup(); - }, - onHangupCall: (arg0){ - // _onHangup(); - }, - - onOffer: (offerSdp, callerUser) async{ - print('${offerSdp.toString()} | ${callerUser.toString()}'); - await signaling.answerOffer(offerSdp); - } - ); - } - return connected; - } - - @override - void dispose() { - // TODO: implement dispose - super.dispose(); - _localRenderer?.dispose(); - _remoteRenderer?.dispose(); - _audioButton?.close(); - _videoButton?.close(); - localMediaStream?.dispose(); - remoteMediaStream?.dispose(); - _disposeStreamsAndSubscriptions(); - } - - Future _disposeStreamsAndSubscriptions() async { - if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close(); - if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close(); - } - - @override - Widget build(BuildContext context) { - // return WillPopScope( - // onWillPop: () async => false, - // child: Scaffold( - // backgroundColor: Colors.black, - // // body: , - // ), - // ); - - return Scaffold( - backgroundColor: Colors.white, - body: showNoise ? _buildNoiseBox() : buildLayout(), - ); - } - - LayoutBuilder buildLayout() { - return LayoutBuilder( - builder: (BuildContext context, BoxConstraints constraints) { - return Stack( - children: [ - CamViewWidget( - localRenderer: _localRenderer, - remoteRenderer: _remoteRenderer, - constraints: constraints, - onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController, - onButtonBarHeightStreamController: _onButtonBarHeightStreamController, - ), - ConferenceButtonBar( - audioEnabled: _audioButton.stream, - videoEnabled: _videoButton.stream, - onAudioEnabled: _onAudioEnable, - onVideoEnabled: _onVideoEnabled, - onSwitchCamera: _onSwitchCamera, - onHangup: _onHangup, - onPersonAdd: () {}, - onPersonRemove: () {}, - onHeight: _onHeightBar, - onShow: _onShowBar, - onHide: _onHideBar, - ), - ], - ); - }, - ); - } - - NoiseBox _buildNoiseBox() { - return NoiseBox( - density: NoiseBoxDensity.xLow, - backgroundColor: Colors.grey.shade900, - child: Center( - child: Container( - color: Colors.black54, - width: double.infinity, - height: 40, - child: Center( - child: Text( - 'Waiting for another participant to connect to the call...', - key: Key('text-wait'), - textAlign: TextAlign.center, - style: TextStyle(color: Colors.white), - ), - ), - ), - ), - ); - } - - Function _onAudioEnable() { - final audioTrack = localMediaStream.getAudioTracks()[0]; - final mute = audioTrack.muted; - Helper.setMicrophoneMute(!mute, audioTrack); - _audioButton.add(mute); - } - - Function _onVideoEnabled() { - final videoTrack = localMediaStream.getVideoTracks()[0]; - bool videoEnabled = videoTrack.enabled; - localMediaStream.getVideoTracks()[0].enabled = !videoEnabled; - _videoButton.add(!videoEnabled); - } - - Function _onSwitchCamera() { - Helper.switchCamera(localMediaStream.getVideoTracks()[0]); - } - - void _onShowBar() { - setState(() { - }); - _onButtonBarVisibleStreamController.add(true); - } - - void _onHeightBar(double height) { - _onButtonBarHeightStreamController.add(height); - } - - void _onHideBar() { - setState(() { - SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]); - }); - _onButtonBarVisibleStreamController.add(false); - } - - Future _onHangup() async { - signaling.hangupCall(widget.callerId, widget.receiverId); - print('onHangup'); - Navigator.of(context).pop(); - } - - -} +// import 'dart:async'; +// +// import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart'; +// import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart'; +// import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart'; +// import 'package:flutter/material.dart'; +// import 'package:flutter/services.dart'; +// // import 'package:flutter_webrtc/flutter_webrtc.dart'; +// +// import '../conference_button_bar.dart'; +// +// class CallHomePage extends StatefulWidget { +// final String receiverId; +// final String callerId; +// +// const CallHomePage({Key key, this.receiverId, this.callerId}) : super(key: key); +// +// @override +// _CallHomePageState createState() => _CallHomePageState(); +// } +// +// class _CallHomePageState extends State { +// bool showNoise = false; +// // RTCVideoRenderer _localRenderer = RTCVideoRenderer(); +// // RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); +// +// final StreamController _audioButton = StreamController.broadcast(); +// final StreamController _videoButton = StreamController.broadcast(); +// final StreamController _onButtonBarVisibleStreamController = StreamController.broadcast(); +// final StreamController _onButtonBarHeightStreamController = StreamController.broadcast(); +// +// //Stream to enable video +// // MediaStream localMediaStream; +// // MediaStream remoteMediaStream; +// Signaling signaling = Signaling()..init(); +// +// @override +// void initState() { +// // TODO: implement initState +// super.initState(); +// startCall(); +// } +// +// startCall() async{ +// // await _localRenderer.initialize(); +// // await _remoteRenderer.initialize(); +// } +// +// Future _disposeStreamsAndSubscriptions() async { +// if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close(); +// if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close(); +// } +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// backgroundColor: Colors.white, +// body: Container() //showNoise ? _buildNoiseBox() : buildLayout(), +// ); +// } +// } diff --git a/lib/pages/conference/web_rtc/call_home_page_.dart b/lib/pages/conference/web_rtc/call_home_page_.dart new file mode 100644 index 00000000..27fb5919 --- /dev/null +++ b/lib/pages/conference/web_rtc/call_home_page_.dart @@ -0,0 +1,186 @@ +import 'dart:async'; + +import 'package:diplomaticquarterapp/pages/conference/web_rtc/widgets/cam_view_widget.dart'; +import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart'; +import 'package:diplomaticquarterapp/pages/webRTC/signaling.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_webrtc/flutter_webrtc.dart'; + +import '../conference_button_bar.dart'; + +class CallHomePage extends StatefulWidget { + final String receiverId; + final String callerId; + + const CallHomePage({Key key, this.receiverId, this.callerId}) : super(key: key); + + @override + _CallHomePageState createState() => _CallHomePageState(); +} + +class _CallHomePageState extends State { + bool showNoise = true; + RTCVideoRenderer _localRenderer = RTCVideoRenderer(); + RTCVideoRenderer _remoteRenderer = RTCVideoRenderer(); + + final StreamController _audioButton = StreamController.broadcast(); + final StreamController _videoButton = StreamController.broadcast(); + final StreamController _onButtonBarVisibleStreamController = StreamController.broadcast(); + final StreamController _onButtonBarHeightStreamController = StreamController.broadcast(); + + //Stream to enable video + MediaStream localMediaStream; + MediaStream remoteMediaStream; + Signaling signaling = Signaling()..init(); + + @override + void initState() { + // TODO: implement initState + super.initState(); + startCall(); + } + + startCall() async{ + await _localRenderer.initialize(); + await _remoteRenderer.initialize(); + final connected = await receivedCall(); + } + + + Future receivedCall() async { + //Stream local media + localMediaStream = await navigator.mediaDevices.getUserMedia({'video': true, 'audio': true}); + _localRenderer.srcObject = localMediaStream; + + final connected = await signaling.acceptCall(widget.callerId, widget.receiverId, localMediaStream: localMediaStream, onRemoteMediaStream: (remoteMediaStream){ + setState(() { + this.remoteMediaStream = remoteMediaStream; + _remoteRenderer.srcObject = remoteMediaStream; + }); + }); + + if(connected){ + signaling.signalR.listen( + onAcceptCall: (arg0){ + print(arg0.toString()); + }, + onCandidate: (candidateJson){ + signaling.addCandidate(candidateJson); + }, + onDeclineCall: (arg0,arg1){ + // _onHangup(); + }, + onHangupCall: (arg0){ + // _onHangup(); + }, + + onOffer: (offerSdp, callerUser) async{ + print('${offerSdp.toString()} | ${callerUser.toString()}'); + await signaling.answerOffer(offerSdp); + } + ); + } + return connected; + } + + @override + void dispose() { + // TODO: implement dispose + super.dispose(); + _localRenderer?.dispose(); + _remoteRenderer?.dispose(); + _audioButton?.close(); + _videoButton?.close(); + localMediaStream?.dispose(); + remoteMediaStream?.dispose(); + _disposeStreamsAndSubscriptions(); + } + + Future _disposeStreamsAndSubscriptions() async { + if (_onButtonBarVisibleStreamController != null) await _onButtonBarVisibleStreamController.close(); + if (_onButtonBarHeightStreamController != null) await _onButtonBarHeightStreamController.close(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: Colors.white, + body: buildLayout(), + ); + } + + LayoutBuilder buildLayout() { + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + return Stack( + children: [ + CamViewWidget( + localRenderer: _localRenderer, + remoteRenderer: _remoteRenderer, + constraints: constraints, + onButtonBarVisibleStreamController: _onButtonBarVisibleStreamController, + onButtonBarHeightStreamController: _onButtonBarHeightStreamController, + ), + ConferenceButtonBar( + audioEnabled: _audioButton.stream, + videoEnabled: _videoButton.stream, + onAudioEnabled: _onAudioEnable, + onVideoEnabled: _onVideoEnabled, + onSwitchCamera: _onSwitchCamera, + onHangup: _onHangup, + onPersonAdd: () {}, + onPersonRemove: () {}, + onHeight: _onHeightBar, + onShow: _onShowBar, + onHide: _onHideBar, + ), + ], + ); + }, + ); + } + + Function _onAudioEnable() { + final audioTrack = localMediaStream.getAudioTracks()[0]; + final mute = audioTrack.muted; + Helper.setMicrophoneMute(!mute, audioTrack); + _audioButton.add(mute); + } + + Function _onVideoEnabled() { + final videoTrack = localMediaStream.getVideoTracks()[0]; + bool videoEnabled = videoTrack.enabled; + localMediaStream.getVideoTracks()[0].enabled = !videoEnabled; + _videoButton.add(!videoEnabled); + } + + Function _onSwitchCamera() { + Helper.switchCamera(localMediaStream.getVideoTracks()[0]); + } + + void _onShowBar() { + setState(() { + }); + _onButtonBarVisibleStreamController.add(true); + } + + void _onHeightBar(double height) { + _onButtonBarHeightStreamController.add(height); + } + + void _onHideBar() { + setState(() { + SystemChrome.setEnabledSystemUIOverlays([SystemUiOverlay.bottom]); + }); + _onButtonBarVisibleStreamController.add(false); + } + + Future _onHangup() async { + signaling.hangupCall(widget.callerId, widget.receiverId); + print('onHangup'); + Navigator.of(context).pop(); + } + + +} diff --git a/lib/pages/conference/web_rtc/widgets/cam_view_widget.dart b/lib/pages/conference/web_rtc/widgets/cam_view_widget.dart index d27dad55..c652cacc 100644 --- a/lib/pages/conference/web_rtc/widgets/cam_view_widget.dart +++ b/lib/pages/conference/web_rtc/widgets/cam_view_widget.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'dart:core'; +import 'package:diplomaticquarterapp/pages/conference/widgets/noise_box.dart'; import 'package:flutter/material.dart'; import 'package:flutter_webrtc/flutter_webrtc.dart'; @@ -36,19 +37,46 @@ class _CamViewWidgetState extends State { FractionallySizedBox( heightFactor: 1, widthFactor: 1, child: Container( - child: RTCVideoView(widget.remoteRenderer, mirror: true), + color: Colors.black87, + child: RTCVideoView(widget.remoteRenderer, mirror: true,filterQuality: FilterQuality.medium,), ), ), + + if(widget.remoteRenderer.srcObject == null) + Positioned.fill(child: _buildNoiseBox()), + + Positioned.fill( + child: RTCVideoView(widget.remoteRenderer) + ), + DraggableCam( key: Key('publisher'), onButtonBarHeight: widget.onButtonBarHeightStreamController.stream, onButtonBarVisible: widget.onButtonBarVisibleStreamController.stream, availableScreenSize: widget.constraints.biggest, - child: RTCVideoView(widget.localRenderer), + child: RTCVideoView(widget.localRenderer) ), - // Expanded(child: RTCVideoView(widget.remoteRenderer)), + + if(widget.remoteRenderer.srcObject == null) + Container( + margin: EdgeInsets.all(MediaQuery.of(context).size.width/8), + child: Text( + 'Waiting for another participant to connect to the call...', + key: Key('text-wait'), + textAlign: TextAlign.center, + style: TextStyle(color: Colors.white), + ) + ), ], ), ); } + + + Widget _buildNoiseBox() { + return NoiseBox( + density: NoiseBoxDensity.xHigh, + backgroundColor: Colors.grey.shade900, + ); + } } diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index efe9f031..f73172b6 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -27,6 +27,7 @@ import 'package:diplomaticquarterapp/uitl/app_toast.dart'; import 'package:diplomaticquarterapp/uitl/gif_loader_dialog_utils.dart'; import 'package:diplomaticquarterapp/uitl/location_util.dart'; import 'package:diplomaticquarterapp/uitl/navigation_service.dart'; +import 'package:diplomaticquarterapp/uitl/push-notification-handler.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart'; @@ -44,6 +45,7 @@ import 'package:provider/provider.dart'; import '../../locator.dart'; import '../../routes.dart'; + class LandingPage extends StatefulWidget { static LandingPage shared; _LandingPageState state; @@ -197,37 +199,11 @@ class _LandingPageState extends State with WidgetsBindingObserver { void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); - var route = ModalRoute.of(context); - - if (route != null) {} - - //setState(() { AppGlobal.context = context; if (state == AppLifecycleState.resumed) { - if (LandingPage.isOpenCallPage) { - if (Platform.isAndroid) { - return; - } - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - Future.delayed(Duration(seconds: 5), () { - isPageNavigated = false; - }); - }); - } - } + PushNotificationHandler.getInstance().onResume(); sharedPref.remove(APPOINTMENT_HISTORY_MEDICAL); } - - if (state == AppLifecycleState.paused) { - isPageNavigated = false; - } - - if (state == AppLifecycleState.inactive) { - isPageNavigated = false; - } - //}); } @override @@ -239,6 +215,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { @override void initState() { super.initState(); + PushNotificationHandler.getInstance().onResume(); WidgetsBinding.instance.addObserver(this); AppGlobal.context = context; @@ -247,14 +224,11 @@ class _LandingPageState extends State with WidgetsBindingObserver { pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); - // signalRUtil = new SignalRUtil(hubName: "https://VCallApi.hmg.com/WebRTCHub?source=mobile&username=2001273", context: context); - locationUtils = new LocationUtils(isShowConfirmDialog: false, context: context); WidgetsBinding.instance.addPostFrameCallback((_) { if (projectViewModel.isLogin && !projectViewModel.isLoginChild) { familyFileProvider.getSharedRecordByStatus(); } - // if (!signalRUtil.getConnectionState()) signalRUtil.startSignalRConnection(); }); // HMG (Guest/Internet) Wifi Access [Zohaib Kambrani] //for now commented to reduce this call will enable it when needed @@ -263,10 +237,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { // PlatformBridge().connectHMGGuestWifi().then((value) => {GifLoaderDialogUtils.hideDialog(context)}); // }).checkAndConnectIfNoInternet(); - if (Platform.isIOS) { - _firebaseMessaging.requestPermission(); - } - requestPermissions().then((results) { locationUtils.getCurrentLocation(); _firebaseMessaging.getToken().then((String token) { @@ -277,8 +247,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { if (!projectViewModel.isLoginChild) { checkUserStatus(token); } - - // if (projectViewModel.isLogin) this.getNotificationCount(DEVICE_TOKEN); } }); if (results[Permission.location].isGranted) {} @@ -288,180 +256,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { // if (results[Permission.accessMediaLocation].isGranted) ; // if (results[Permission.calendar].isGranted) ; }); - // }); - FirebaseMessaging.onMessage.listen((RemoteMessage message) async { - print("onMessage: $message"); - print(message); - print(message.data['name']); - print(message.data['appointmentdate']); - - if (Platform.isIOS) { - if (message.data['is_call'] == "true") { - var route = ModalRoute.of(context); - - if (route != null) { - print(route.settings.name); - } - Map myMap = new Map.from(message.data); - print(myMap); - LandingPage.isOpenCallPage = true; - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - isPageNavigated = false; - }); - } - } else { - print("Is Call Not Found iOS"); - } - } else { - print("Is Call Not Found iOS"); - } - - if (Platform.isAndroid) { - print("messagedata:${message}"); - print("messagedata:${message.data}"); - if (message.data.containsKey("is_call")) { - var route = ModalRoute.of(context); - - if (route != null) { - print(route.settings.name); - } - - Map myMap = new Map.from(message.data); - print(myMap); - if (LandingPage.isOpenCallPage) { - return; - } - LandingPage.isOpenCallPage = true; - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - if (!isPageNavigated) { - isPageNavigated = true; - Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - Future.delayed(Duration(seconds: 5), () { - isPageNavigated = false; - }); - }); - } - } else { - print("Is Call Not Found Android"); - LocalNotification.getInstance().showNow(title: message.data['notification']['title'], subtitle: message.data['notification']['body']); - } - } else { - print("Is Call Not Found Android"); - } - }); - FirebaseMessaging.onBackgroundMessage((message) { - return Platform.isIOS ? null : myBackgroundMessageHandler(message.data); - }); - - // todo verify all functionality - - // _firebaseMessaging.configure( - // // onMessage: (Map message) async { - // // // showDialog("onMessage: $message"); - // // print("onMessage: $message"); - // // print(message); - // // print(message['name']); - // // print(message['appointmentdate']); - // // - // // if (Platform.isIOS) { - // // if (message['is_call'] == "true") { - // // var route = ModalRoute.of(context); - // // - // // if (route != null) { - // // print(route.settings.name); - // // } - // // - // // Map myMap = new Map.from(message); - // // print(myMap); - // // LandingPage.isOpenCallPage = true; - // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // // if (!isPageNavigated) { - // // isPageNavigated = true; - // // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - // // isPageNavigated = false; - // // }); - // // } - // // } else { - // // print("Is Call Not Found iOS"); - // // } - // // } else { - // // print("Is Call Not Found iOS"); - // // } - // // - // // if (Platform.isAndroid) { - // // if (message['data'].containsKey("is_call")) { - // // var route = ModalRoute.of(context); - // // - // // if (route != null) { - // // print(route.settings.name); - // // } - // // - // // Map myMap = new Map.from(message['data']); - // // print(myMap); - // // if (LandingPage.isOpenCallPage) { - // // return; - // // } - // // LandingPage.isOpenCallPage = true; - // // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // // if (!isPageNavigated) { - // // isPageNavigated = true; - // // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - // // Future.delayed(Duration(seconds: 5), () { - // // isPageNavigated = false; - // // }); - // // }); - // // } - // // } else { - // // print("Is Call Not Found Android"); - // // LocalNotification.getInstance().showNow(title: message['notification']['title'], subtitle: message['notification']['body']); - // // } - // // } else { - // // print("Is Call Not Found Android"); - // // } - // // }, - // onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, - // onLaunch: (Map message) async { - // print("onLaunch: $message"); - // // showDialog("onLaunch: $message"); - // }, - // onResume: (Map message) async { - // print("onResume: $message"); - // print(message); - // print(message['name']); - // print(message['appointmentdate']); - // - // // showDialog("onResume: $message"); - // - // if (Platform.isIOS) { - // if (message['is_call'] == "true") { - // var route = ModalRoute.of(context); - // - // if (route != null) { - // print(route.settings.name); - // } - // - // Map myMap = new Map.from(message); - // print(myMap); - // LandingPage.isOpenCallPage = true; - // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - // if (!isPageNavigated) { - // isPageNavigated = true; - // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { - // isPageNavigated = false; - // }); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // } else { - // print("Is Call Not Found iOS"); - // } - // }, - // ); } Future> requestPermissions() async { @@ -485,29 +280,6 @@ class _LandingPageState extends State with WidgetsBindingObserver { return permissionResults; } - static Future myBackgroundMessageHandler(Map message) async { - Map myMap = new Map.from(message['data']); - if (message.containsKey('data')) { - LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); - LandingPage.isOpenCallPage = true; - // Future.delayed(Duration(seconds: 3), () { - // Navigator.push(locator().navigatorKey.currentContext, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))); - NavigationService.instance.navigateTo(INCOMING_CALL_PAGE); - // }); - // if (!isPageNavigated) { - // isPageNavigated = true; - // Navigator.push(locator().navigatorKey.currentContext, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))); - // .then((value) { - // isPageNavigated = false; - // }); - // } - } - - if (message.containsKey('notification')) { - final dynamic notification = message['notification']; - } - } - void setUserValues(value) async { if (value != null) sharedPref.setObject(IMEI_USER_DATA, value); } diff --git a/lib/pages/livecare/incoming_call.dart b/lib/pages/livecare/incoming_call.dart index 09a13205..bd191afc 100644 --- a/lib/pages/livecare/incoming_call.dart +++ b/lib/pages/livecare/incoming_call.dart @@ -4,6 +4,7 @@ import 'package:camera/camera.dart'; import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; import 'package:diplomaticquarterapp/models/LiveCare/room_model.dart'; import 'package:diplomaticquarterapp/pages/conference/web_rtc/call_home_page.dart'; +import 'package:diplomaticquarterapp/pages/conference/web_rtc/call_home_page_.dart'; import 'package:diplomaticquarterapp/pages/conference/widgets/platform_exception_alert_dialog.dart'; import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; @@ -197,119 +198,6 @@ class _IncomingCallState extends State with SingleTickerProviderSt } }, ), - // body: isCameraReady - // ? - // : Container( - // height: 200.0, - // width: 200.0, - // color: Colors.green, - // ), - // body: Container( - // decoration: BoxDecoration(color: Colors.grey[700]), - // child: Column( - // mainAxisAlignment: MainAxisAlignment.start, - // mainAxisSize: MainAxisSize.max, - // children: [ - // Container( - // margin: EdgeInsets.only(top: 30.0), - // alignment: Alignment.center, - // child: Text("Incoming Video Call", textAlign: TextAlign.center, style: TextStyle(fontSize: 26.0, color: Colors.white, letterSpacing: 1.0)), - // ), - // Container( - // alignment: Alignment.center, - // margin: EdgeInsets.fromLTRB(50.0, 30.0, 50.0, 20.0), - // child: Image.asset('assets/images/new-design/hmg_full_logo_hd_white.png'), - // ), - // Container( - // margin: EdgeInsets.fromLTRB(30.0, 10.0, 30.0, 0.0), - // child: Divider( - // color: Colors.white, - // thickness: 1.0, - // ), - // ), - // Container( - // margin: EdgeInsets.only(top: 20.0), - // alignment: Alignment.center, - // child: Text("Dr Eyad Ismail Abu Jayab", textAlign: TextAlign.center, style: TextStyle(fontSize: 22.0, fontWeight: FontWeight.bold, letterSpacing: 0.8, color: Colors.white)), - // ), - // Container( - // margin: EdgeInsets.only(top: 10.0), - // alignment: Alignment.center, - // child: Text("ENT Clinic", textAlign: TextAlign.center, style: TextStyle(fontSize: 22.0, letterSpacing: 0.8, color: Colors.white)), - // ), - // Container( - // margin: EdgeInsets.only(top: 10.0), - // alignment: Alignment.center, - // child: Text("Speciality", textAlign: TextAlign.center, style: TextStyle(fontSize: 22.0, letterSpacing: 0.8, color: Colors.white)), - // ), - // Container( - // decoration: BoxDecoration( - // color: Colors.grey[900].withOpacity(0.8), - // borderRadius: BorderRadius.all(Radius.circular(10.0)), - // ), - // padding: EdgeInsets.all(20.0), - // margin: EdgeInsets.only(top: 20.0), - // child: Column( - // children: [ - // Text("Appointment Information", textAlign: TextAlign.center, style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold, letterSpacing: 1.0, color: Colors.white)), - // Container( - // margin: EdgeInsets.only(top: 20.0), - // child: Text("Sun, 15th Dec, 2019, 09:00", textAlign: TextAlign.center, style: TextStyle(fontSize: 20.0, letterSpacing: 1.0, color: Colors.white)), - // ), - // Container( - // margin: EdgeInsets.only(top: 20.0), - // child: Text("ENT Clinic", textAlign: TextAlign.center, style: TextStyle(fontSize: 20.0, letterSpacing: 1.0, color: Colors.white)), - // ), - // ], - // ), - // ), - // Container( - // margin: EdgeInsets.only(top: 100.0), - // alignment: Alignment.center, - // child: Row( - // mainAxisSize: MainAxisSize.max, - // mainAxisAlignment: MainAxisAlignment.spaceEvenly, - // children: [ - // RotationTransition( - // turns: Tween(begin: 0.0, end: -.1).chain(CurveTween(curve: Curves.elasticIn)).animate(_animationController), - // child: Container( - // child: RawMaterialButton( - // onPressed: () { - // _submit(); - // }, - // elevation: 2.0, - // fillColor: Colors.green, - // child: Icon( - // Icons.call, - // color: Colors.white, - // size: 35.0, - // ), - // padding: EdgeInsets.all(15.0), - // shape: CircleBorder(), - // ), - // )), - // Container( - // child: RawMaterialButton( - // onPressed: () { - // LandingPage.isOpenCallPage = false; - // backToHome(); - // }, - // elevation: 2.0, - // fillColor: Colors.red, - // child: Icon( - // Icons.call_end, - // color: Colors.white, - // size: 35.0, - // ), - // padding: EdgeInsets.all(15.0), - // shape: CircleBorder(), - // ), - // ), - // ], - // ), - // ), - // ], - // )), ); } @@ -339,6 +227,7 @@ class _IncomingCallState extends State with SingleTickerProviderSt Future _submit() async { // backToHome(); try { + final roomModel = RoomModel(name: widget.incomingCallData.name, token: widget.incomingCallData.sessionId, identity: widget.incomingCallData.identity); // await Navigator.of(context).push( @@ -348,6 +237,7 @@ class _IncomingCallState extends State with SingleTickerProviderSt // ConferencePage(roomModel: roomModel), // ), // ); + _controller.dispose(); await Navigator.of(context).pushReplacement( MaterialPageRoute( fullscreenDialog: true, diff --git a/lib/uitl/app_shared_preferences.dart b/lib/uitl/app_shared_preferences.dart index 3ea323df..f90a2f98 100644 --- a/lib/uitl/app_shared_preferences.dart +++ b/lib/uitl/app_shared_preferences.dart @@ -79,7 +79,7 @@ class AppSharedPreferences { } /// Get Object [key] the key was saved - getObject(String key) async { + Future getObject(String key) async { final SharedPreferences prefs = await _prefs; var string = prefs.getString(key); if (string == null) { diff --git a/lib/uitl/navigation_service.dart b/lib/uitl/navigation_service.dart index 3e720dea..7bc9af04 100644 --- a/lib/uitl/navigation_service.dart +++ b/lib/uitl/navigation_service.dart @@ -1,12 +1,19 @@ +import 'package:diplomaticquarterapp/locator.dart'; import 'package:flutter/material.dart'; class NavigationService { final GlobalKey navigatorKey = new GlobalKey(); - static NavigationService instance = NavigationService(); - Future navigateTo(String routeName) { - return navigatorKey.currentState.pushNamed(routeName); + static Future navigateTo(String routeName) { + final key = locator().navigatorKey; + return key.currentState.pushNamed(routeName); + } + + static Future navigateToPage(Widget page) { + final key = locator().navigatorKey; + final pageRoute = MaterialPageRoute(builder: (context) => page); + return Navigator.push(key.currentContext, pageRoute); } } diff --git a/lib/uitl/push-notification-handler.dart b/lib/uitl/push-notification-handler.dart new file mode 100644 index 00000000..8c6ef5dc --- /dev/null +++ b/lib/uitl/push-notification-handler.dart @@ -0,0 +1,279 @@ + +import 'dart:convert'; +import 'dart:io'; +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; +import 'package:diplomaticquarterapp/models/LiveCare/IncomingCallData.dart'; +import 'package:diplomaticquarterapp/pages/landing/landing_page.dart'; +import 'package:diplomaticquarterapp/pages/livecare/incoming_call.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:huawei_push/huawei_push.dart' as h_push; +import 'package:firebase_messaging/firebase_messaging.dart'; +import 'package:firebase_messaging/firebase_messaging.dart' as fir; +import 'package:flutter_hms_gms_availability/flutter_hms_gms_availability.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +import 'app_shared_preferences.dart'; +import 'navigation_service.dart'; + + +// |--> Push Notification Background +Future backgroundMessageHandler(dynamic message) async{ + + fir.RemoteMessage message_; + if(message is h_push.RemoteMessage){ // if huawei remote message convert it to Firebase Remote Message + message_ = toFirebaseRemoteMessage(message); + } + + if (message_.data != null && message_.data['is_call'] == 'true') { + _incomingCall(message_.data); + return; + } + + + print("Background message is received, sending local notification."); + h_push.Push.localNotification({ + h_push.HMSLocalNotificationAttr.TITLE: 'Background Message', + h_push.HMSLocalNotificationAttr.MESSAGE: "By: BackgroundMessageHandler" + }); + +} +// Push Notification Background <--| + + + +RemoteMessage toFirebaseRemoteMessage(h_push.RemoteMessage message){ + final payload_data = jsonDecode(message.data); + final fire_message = RemoteMessage( + from: message.from, + collapseKey: message.collapseKey, + data: payload_data['data'], + messageId: message.messageId, + sentTime: DateTime.fromMillisecondsSinceEpoch(message.sentTime*1000), + ttl: message.ttl, + category: null, + messageType: message.type, + notification: RemoteNotification( + title: message.notification.title, + titleLocArgs: (message.notification.titleLocalizationArgs ?? []).map((e) => e.toString()).toList(), + titleLocKey: message.notification.titleLocalizationKey, + body: message.notification.body, + bodyLocArgs: (message.notification.bodyLocalizationArgs ?? []).map((e) => e.toString()).toList(), + bodyLocKey: message.notification.bodyLocalizationKey, + android: AndroidNotification( + channelId: message.notification.channelId, + clickAction: message.notification.clickAction, + color: message.notification.color, + count: null, + imageUrl: message.notification.imageUrl.path, + link: message.notification.link.path, + smallIcon: message.notification.icon, + sound: message.notification.sound, + ticker: message.notification.ticker, + tag: message.notification.tag, + ), + ) + ); + return fire_message; +} + +_incomingCall(Map data) async{ + LandingPage.incomingCallData = IncomingCallData.fromJson(data); + if(LandingPage.isOpenCallPage == false){ + LandingPage.isOpenCallPage = true; + await NavigationService.navigateToPage(IncomingCall(incomingCallData: LandingPage.incomingCallData)); + LandingPage.isOpenCallPage = false; + } + await Future.delayed(Duration(milliseconds: 500)); + await AppSharedPreferences().remove('call_data'); +} + +class PushNotificationHandler{ + final BuildContext context; + static PushNotificationHandler _instance; + + PushNotificationHandler(this.context){ + PushNotificationHandler._instance = this; + } + + static PushNotificationHandler getInstance() => _instance; + + init() async{ + if (Platform.isIOS) { + final permission = await FirebaseMessaging.instance.requestPermission(); + if(permission.authorizationStatus == AuthorizationStatus.denied) + return; + } + + if(Platform.isAndroid && (await FlutterHmsGmsAvailability.isHmsAvailable)) { // 'Android HMS' (Handle Huawei Push_Kit Streams) + + h_push.Push.enableLogger(); + final result = await h_push.Push.setAutoInitEnabled(true); + + h_push.Push.onNotificationOpenedApp.listen((message){ + newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); + + h_push.Push.onMessageReceivedStream.listen((message){ + newMessage(toFirebaseRemoteMessage(message)); + }, onError: (e) => print(e.toString())); + + + h_push.Push.getTokenStream.listen((token){ + onToken(token); + }, onError: (e) => print(e.toString())); + await h_push.Push.getToken(''); + + + h_push.Push.registerBackgroundMessageHandler(backgroundMessageHandler); + + }else{ // 'Android GMS or iOS' (Handle Firebase Messaging Streams) + + FirebaseMessaging.onMessage.listen((RemoteMessage message) async { + newMessage(message); + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { + newMessage(message); + }); + + FirebaseMessaging.instance.onTokenRefresh.listen((fcm_token) { + onToken(fcm_token); + }); + + FirebaseMessaging.onBackgroundMessage(backgroundMessageHandler); + + final fcmToken = await FirebaseMessaging.instance.getToken(); + if(fcmToken != null) + onToken(fcmToken); + } + } + + + newMessage(RemoteMessage remoteMessage){ + print('RemoteMessage.data:: ${remoteMessage.data}'); + if(remoteMessage.data['is_call'] == 'true' || remoteMessage.data['is_call'] == true) + _incomingCall(remoteMessage.data); + + } + + onToken(String token) async{ + print("Push Notification Token: " + token); + AppSharedPreferences().setString(PUSH_TOKEN, token); + DEVICE_TOKEN = token; + } + + onResume() async { + var call_data = await AppSharedPreferences().getObject('call_data'); + if(call_data != null){ + _incomingCall(call_data); + } + } + +} + +/* todo verify all functionality */ +// _firebaseMessaging.configure( +// // onMessage: (Map message) async { +// // // showDialog("onMessage: $message"); +// // print("onMessage: $message"); +// // print(message); +// // print(message['name']); +// // print(message['appointmentdate']); +// // +// // if (Platform.isIOS) { +// // if (message['is_call'] == "true") { +// // var route = ModalRoute.of(context); +// // +// // if (route != null) { +// // print(route.settings.name); +// // } +// //s +// // Map myMap = new Map.from(mesage); +// // print(myMap); +// // LandingPage.isOpenCallPage = true; +// // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); +// // if (!isPageNavigated) { +// // isPageNavigated = true; +// // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { +// // isPageNavigated = false; +// // }); +// // } +// // } else { +// // print("Is Call Not Found iOS"); +// // } +// // } else { +// // print("Is Call Not Found iOS"); +// // } +// // +// // if (Platform.isAndroid) { +// // if (message['data'].containsKey("is_call")) { +// // var route = ModalRoute.of(context); +// // +// // if (route != null) { +// // print(route.settings.name); +// // } +// // +// // Map myMap = new Map.from(message['data']); +// // print(myMap); +// // if (LandingPage.isOpenCallPage) { +// // return; +// // } +// // LandingPage.isOpenCallPage = true; +// // LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); +// // if (!isPageNavigated) { +// // isPageNavigated = true; +// // Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { +// // Future.delayed(Duration(seconds: 5), () { +// // isPageNavigated = false; +// // }); +// // }); +// // } +// // } else { +// // print("Is Call Not Found Android"); +// // LocalNotification.getInstance().showNow(title: message['notification']['title'], subtitle: message['notification']['body']); +// // } +// // } else { +// // print("Is Call Not Found Android"); +// // } +// // }, +// onBackgroundMessage: Platform.isIOS ? null : myBackgroundMessageHandler, +// onLaunch: (Map message) async { +// print("onLaunch: $message"); +// // showDialog("onLaunch: $message"); +// }, +// onResume: (Map message) async { +// print("onResume: $message"); +// print(message); +// print(message['name']); +// print(message['appointmentdate']); +// +// // showDialog("onResume: $message"); +// +// if (Platform.isIOS) { +// if (message['is_call'] == "true") { +// var route = ModalRoute.of(context); +// +// if (route != null) { +// print(route.settings.name); +// } +// +// Map myMap = new Map.from(message); +// print(myMap); +// LandingPage.isOpenCallPage = true; +// LandingPage.incomingCallData = IncomingCallData.fromJson(myMap); +// if (!isPageNavigated) { +// isPageNavigated = true; +// Navigator.push(context, MaterialPageRoute(builder: (context) => IncomingCall(incomingCallData: LandingPage.incomingCallData))).then((value) { +// isPageNavigated = false; +// }); +// } +// } else { +// print("Is Call Not Found iOS"); +// } +// } else { +// print("Is Call Not Found iOS"); +// } +// }, +// ); \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 8cf5ace0..b67ccb0b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -56,6 +56,8 @@ dependencies: flutter_flexible_toast: ^0.1.4 firebase_messaging: ^11.1.0 firebase_analytics: ^8.3.4 + + # Progress bar progress_hud_v2: ^2.0.0 percent_indicator: ^3.4.0 @@ -84,7 +86,10 @@ dependencies: charts_flutter: ^0.12.0 google_maps_flutter: ^2.1.1 + + # Huawei huawei_map: ^6.0.1+304 + huawei_push: ^5.3.0+304 # Qr code Scanner TODO fix it # barcode_scanner: ^1.0.1 @@ -134,7 +139,7 @@ dependencies: jiffy: ^4.1.0 #Flutter WebRTC - flutter_webrtc: ^0.7.1 + flutter_webrtc: ^0.8.0 screen: ^0.0.5