├── .github ├── CODEOWNERS ├── actions │ └── pana │ │ └── action.yml ├── pull_request_template.md └── workflows │ ├── app-distribute.yml │ ├── legacy_version_analyze.yml │ ├── pana.yml │ ├── scripts │ └── remove-from-coverage.sh │ └── stream_video_flutter_workflow.yml ├── .gitignore ├── .readme-assets └── Github-Graphic-Flutter.jpg ├── .run └── dogfooding.run.xml ├── LICENSE ├── README.md ├── SECURITY.md ├── all_lint_rules.yaml ├── analysis_options.yaml ├── development.md ├── dogfooding ├── .metadata ├── Fastfile ├── README.md ├── analysis_options.yaml ├── android │ ├── .ruby-version │ ├── .sign │ │ └── debug.keystore │ ├── Gemfile │ ├── app │ │ ├── build.gradle │ │ ├── google-services.json │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── beta │ │ │ └── res │ │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ │ ├── dev │ │ │ └── res │ │ │ │ └── drawable-v24 │ │ │ │ └── ic_launcher_background.xml │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── flutter │ │ │ │ │ └── app │ │ │ │ │ └── FlutterMultiDexApplication.java │ │ │ ├── kotlin │ │ │ │ └── io │ │ │ │ │ └── getstream │ │ │ │ │ └── video │ │ │ │ │ └── flutter │ │ │ │ │ └── dogfooding │ │ │ │ │ └── MainActivity.kt │ │ │ └── res │ │ │ │ ├── drawable-hdpi │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── drawable-mdpi │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── drawable-v21 │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v24 │ │ │ │ └── ic_launcher_background.xml │ │ │ │ ├── drawable-xhdpi │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── ic_launcher_monochrome.png │ │ │ │ ├── drawable │ │ │ │ ├── ic_launcher_foreground.xml │ │ │ │ └── launch_background.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ ├── ic_launcher.xml │ │ │ │ └── ic_launcher_round.xml │ │ │ │ ├── mipmap-hdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-mdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ ├── ic_launcher.webp │ │ │ │ └── ic_launcher_round.webp │ │ │ │ ├── values-night │ │ │ │ └── styles.xml │ │ │ │ └── values │ │ │ │ └── styles.xml │ │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── build.gradle │ ├── fastlane │ │ ├── Appfile │ │ ├── Fastfile │ │ ├── Pluginfile │ │ └── README.md │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ └── settings.gradle ├── assets │ ├── bg1.jpg │ ├── bg2.jpg │ ├── bg3.jpg │ ├── global_network.svg │ ├── google_logo.svg │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_background.svg │ ├── ic_launcher_foreground.png │ ├── ic_launcher_foreground.svg │ ├── stream_logo.svg │ ├── stream_video_icon.png │ └── video_icon.png ├── firebase.json ├── ios │ ├── .ruby-version │ ├── Flutter │ │ ├── AppFrameworkInfo.plist │ │ ├── Debug.xcconfig │ │ └── Release.xcconfig │ ├── Gemfile │ ├── Podfile │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ └── WorkspaceSettings.xcsettings │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Runner.xcscheme │ │ │ ├── ScreenSharing.xcscheme │ │ │ ├── beta.xcscheme │ │ │ ├── dev.xcscheme │ │ │ └── prod.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ ├── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ │ ├── AppIcon-beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── icon1024.png │ │ │ │ ├── icon120.png │ │ │ │ ├── icon152.png │ │ │ │ ├── icon167.png │ │ │ │ ├── icon180.png │ │ │ │ ├── icon40.png │ │ │ │ ├── icon58.png │ │ │ │ ├── icon60.png │ │ │ │ ├── icon76.png │ │ │ │ ├── icon80.png │ │ │ │ └── icon87.png │ │ │ ├── AppIcon-dev.appiconset │ │ │ │ ├── AppIcon-20@2x.png │ │ │ │ ├── AppIcon-20@3x.png │ │ │ │ ├── AppIcon-29@2x.png │ │ │ │ ├── AppIcon-29@3x.png │ │ │ │ ├── AppIcon-40@2x.png │ │ │ │ ├── AppIcon-40@3x.png │ │ │ │ ├── AppIcon-60@2x~car.png │ │ │ │ ├── AppIcon-60@3x~car.png │ │ │ │ ├── AppIcon~ios-marketing.png │ │ │ │ └── Contents.json │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-50x50@1x.png │ │ │ │ ├── Icon-App-50x50@2x.png │ │ │ │ ├── Icon-App-57x57@1x.png │ │ │ │ ├── Icon-App-57x57@2x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-72x72@1x.png │ │ │ │ ├── Icon-App-72x72@2x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ │ ├── Contents.json │ │ │ └── IconMask.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon-Mask@1x.png │ │ │ │ ├── Icon-Mask@2x.png │ │ │ │ └── Icon-Mask@3x.png │ │ ├── Base.lproj │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Main.storyboard │ │ ├── GoogleService-Info.plist │ │ ├── Info.plist │ │ ├── Runner-Bridging-Header.h │ │ └── Runner.entitlements │ ├── ScreenSharing │ │ ├── Info.plist │ │ ├── SampleHandler.swift │ │ └── ScreenSharing.entitlements │ ├── fastlane │ │ ├── Appfile │ │ ├── Fastfile │ │ ├── Matchfile │ │ └── README.md │ └── firebase_app_id_file.json ├── lib │ ├── app │ │ ├── app.dart │ │ ├── app_content.dart │ │ ├── custom_video_localizations.dart │ │ └── user_auth_controller.dart │ ├── core │ │ ├── model │ │ │ ├── environment.dart │ │ │ └── user_credentials.dart │ │ └── repos │ │ │ ├── app_preferences.dart │ │ │ ├── custom_environment_loader.dart │ │ │ ├── token_service.dart │ │ │ ├── user_auth_repository.dart │ │ │ └── user_chat_repository.dart │ ├── di │ │ └── injector.dart │ ├── dogfooding_app_channel.dart │ ├── firebase_options.dart │ ├── log_config.dart │ ├── main.dart │ ├── router │ │ ├── router.dart │ │ ├── routes.dart │ │ └── routes.g.dart │ ├── screens │ │ ├── call_participants_list.dart │ │ ├── call_screen.dart │ │ ├── call_stats_screen.dart │ │ ├── home_screen.dart │ │ ├── livestream_demo_screen.dart │ │ ├── lobby_screen.dart │ │ ├── login_screen.dart │ │ ├── qr_code_scanner.dart │ │ ├── splash_screen.dart │ │ └── stats_latency_chart.dart │ ├── theme │ │ └── app_palette.dart │ ├── utils │ │ ├── after_layout.dart │ │ ├── assets.dart │ │ ├── consts.dart │ │ ├── feedback_dialog.dart │ │ └── loading_dialog.dart │ └── widgets │ │ ├── badged_call_option.dart │ │ ├── call_duration_title.dart │ │ ├── closed_captions_widget.dart │ │ ├── device_list.dart │ │ ├── environment_switcher.dart │ │ ├── settings_menu │ │ ├── audio_output_menu_item.dart │ │ ├── background_filters_menu_item.dart │ │ ├── closed_captions_menu_item.dart │ │ ├── noise_cancellation_menu_item.dart │ │ ├── settings_menu.dart │ │ ├── settings_menu_item.dart │ │ └── standard_action_menu_item.dart │ │ ├── share_call_card.dart │ │ ├── stream_button.dart │ │ └── user_actions_avatar.dart ├── linux │ ├── CMakeLists.txt │ ├── flutter │ │ ├── CMakeLists.txt │ │ ├── generated_plugin_registrant.cc │ │ ├── generated_plugin_registrant.h │ │ └── generated_plugins.cmake │ ├── main.cc │ ├── my_application.cc │ └── my_application.h ├── macos │ ├── Flutter │ │ ├── Flutter-Debug.xcconfig │ │ └── Flutter-Release.xcconfig │ ├── Podfile │ ├── Runner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ └── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ ├── Runner.xcscheme │ │ │ ├── beta.xcscheme │ │ │ ├── dev.xcscheme │ │ │ └── prod.xcscheme │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── Runner │ │ ├── AppDelegate.swift │ │ ├── Assets.xcassets │ │ │ ├── AppIcon-beta.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── app_icon_1024.png │ │ │ │ ├── app_icon_128.png │ │ │ │ ├── app_icon_16.png │ │ │ │ ├── app_icon_256.png │ │ │ │ ├── app_icon_32.png │ │ │ │ ├── app_icon_512.png │ │ │ │ └── app_icon_64.png │ │ │ ├── AppIcon-dev.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── app_icon_1024.png │ │ │ │ ├── app_icon_128.png │ │ │ │ ├── app_icon_16.png │ │ │ │ ├── app_icon_256.png │ │ │ │ ├── app_icon_32.png │ │ │ │ ├── app_icon_512.png │ │ │ │ └── app_icon_64.png │ │ │ ├── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── app_icon_1024.png │ │ │ │ ├── app_icon_128.png │ │ │ │ ├── app_icon_16.png │ │ │ │ ├── app_icon_256.png │ │ │ │ ├── app_icon_32.png │ │ │ │ ├── app_icon_512.png │ │ │ │ └── app_icon_64.png │ │ │ └── Contents.json │ │ ├── Base.lproj │ │ │ └── MainMenu.xib │ │ ├── Configs │ │ │ ├── AppInfo.xcconfig │ │ │ ├── Debug.xcconfig │ │ │ ├── Release.xcconfig │ │ │ └── Warnings.xcconfig │ │ ├── DebugProfile.entitlements │ │ ├── GoogleService-Info.plist │ │ ├── Info.plist │ │ ├── MainFlutterWindow.swift │ │ └── Release.entitlements │ └── firebase_app_id_file.json ├── pubspec.yaml ├── web │ ├── favicon.png │ ├── icons │ │ ├── Icon-192.png │ │ ├── Icon-512.png │ │ ├── Icon-maskable-192.png │ │ └── Icon-maskable-512.png │ ├── index.html │ └── manifest.json └── windows │ ├── CMakeLists.txt │ ├── flutter │ ├── CMakeLists.txt │ └── generated_plugins.cmake │ └── runner │ ├── CMakeLists.txt │ ├── Runner.rc │ ├── flutter_window.cpp │ ├── flutter_window.h │ ├── main.cpp │ ├── resource.h │ ├── resources │ └── app_icon.ico │ ├── runner.exe.manifest │ ├── utils.cpp │ ├── utils.h │ ├── win32_window.cpp │ └── win32_window.h ├── env.sample ├── melos.yaml ├── packages ├── stream_video │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── example │ │ └── lib │ │ │ └── main.dart │ ├── generate-openapi-origin.sh │ ├── generate-openapi-stream.sh │ ├── lib │ │ ├── globals.dart │ │ ├── open_api │ │ │ └── video │ │ │ │ └── coordinator │ │ │ │ ├── api.dart │ │ │ │ ├── api │ │ │ │ └── productvideo_api.dart │ │ │ │ ├── api_client.dart │ │ │ │ ├── api_exception.dart │ │ │ │ ├── api_helper.dart │ │ │ │ ├── auth │ │ │ │ ├── api_key_auth.dart │ │ │ │ ├── authentication.dart │ │ │ │ ├── http_basic_auth.dart │ │ │ │ ├── http_bearer_auth.dart │ │ │ │ └── oauth.dart │ │ │ │ └── model │ │ │ │ ├── accept_call_response.dart │ │ │ │ ├── aggregated_stats.dart │ │ │ │ ├── api_error.dart │ │ │ │ ├── app_event_response.dart │ │ │ │ ├── app_updated_event.dart │ │ │ │ ├── audio_settings_request.dart │ │ │ │ ├── audio_settings_response.dart │ │ │ │ ├── backstage_settings_request.dart │ │ │ │ ├── backstage_settings_response.dart │ │ │ │ ├── block_user_request.dart │ │ │ │ ├── block_user_response.dart │ │ │ │ ├── blocked_user_event.dart │ │ │ │ ├── bound.dart │ │ │ │ ├── broadcast_settings_request.dart │ │ │ │ ├── broadcast_settings_response.dart │ │ │ │ ├── call_accepted_event.dart │ │ │ │ ├── call_closed_caption.dart │ │ │ │ ├── call_closed_captions_failed_event.dart │ │ │ │ ├── call_closed_captions_started_event.dart │ │ │ │ ├── call_closed_captions_stopped_event.dart │ │ │ │ ├── call_created_event.dart │ │ │ │ ├── call_deleted_event.dart │ │ │ │ ├── call_duration_report.dart │ │ │ │ ├── call_duration_report_response.dart │ │ │ │ ├── call_ended_event.dart │ │ │ │ ├── call_event.dart │ │ │ │ ├── call_frame_recording_failed_event.dart │ │ │ │ ├── call_frame_recording_frame_ready_event.dart │ │ │ │ ├── call_frame_recording_started_event.dart │ │ │ │ ├── call_frame_recording_stopped_event.dart │ │ │ │ ├── call_hls_broadcasting_failed_event.dart │ │ │ │ ├── call_hls_broadcasting_started_event.dart │ │ │ │ ├── call_hls_broadcasting_stopped_event.dart │ │ │ │ ├── call_ingress_response.dart │ │ │ │ ├── call_live_started_event.dart │ │ │ │ ├── call_member_added_event.dart │ │ │ │ ├── call_member_removed_event.dart │ │ │ │ ├── call_member_updated_event.dart │ │ │ │ ├── call_member_updated_permission_event.dart │ │ │ │ ├── call_missed_event.dart │ │ │ │ ├── call_notification_event.dart │ │ │ │ ├── call_participant_count_report.dart │ │ │ │ ├── call_participant_count_report_response.dart │ │ │ │ ├── call_participant_response.dart │ │ │ │ ├── call_reaction_event.dart │ │ │ │ ├── call_recording.dart │ │ │ │ ├── call_recording_failed_event.dart │ │ │ │ ├── call_recording_ready_event.dart │ │ │ │ ├── call_recording_started_event.dart │ │ │ │ ├── call_recording_stopped_event.dart │ │ │ │ ├── call_rejected_event.dart │ │ │ │ ├── call_request.dart │ │ │ │ ├── call_response.dart │ │ │ │ ├── call_ring_event.dart │ │ │ │ ├── call_rtmp_broadcast_failed_event.dart │ │ │ │ ├── call_rtmp_broadcast_started_event.dart │ │ │ │ ├── call_rtmp_broadcast_stopped_event.dart │ │ │ │ ├── call_session_ended_event.dart │ │ │ │ ├── call_session_participant_counts_updated_event.dart │ │ │ │ ├── call_session_participant_joined_event.dart │ │ │ │ ├── call_session_participant_left_event.dart │ │ │ │ ├── call_session_response.dart │ │ │ │ ├── call_session_started_event.dart │ │ │ │ ├── call_settings_request.dart │ │ │ │ ├── call_settings_response.dart │ │ │ │ ├── call_state_response_fields.dart │ │ │ │ ├── call_stats_report_summary_response.dart │ │ │ │ ├── call_timeline.dart │ │ │ │ ├── call_transcription.dart │ │ │ │ ├── call_transcription_failed_event.dart │ │ │ │ ├── call_transcription_ready_event.dart │ │ │ │ ├── call_transcription_started_event.dart │ │ │ │ ├── call_transcription_stopped_event.dart │ │ │ │ ├── call_updated_event.dart │ │ │ │ ├── call_user_muted_event.dart │ │ │ │ ├── calls_per_day_report.dart │ │ │ │ ├── calls_per_day_report_response.dart │ │ │ │ ├── closed_caption_event.dart │ │ │ │ ├── collect_user_feedback_request.dart │ │ │ │ ├── collect_user_feedback_response.dart │ │ │ │ ├── connect_user_details_request.dart │ │ │ │ ├── connected_event.dart │ │ │ │ ├── connection_error_event.dart │ │ │ │ ├── coordinates.dart │ │ │ │ ├── count.dart │ │ │ │ ├── create_device_request.dart │ │ │ │ ├── create_guest_request.dart │ │ │ │ ├── create_guest_response.dart │ │ │ │ ├── credentials.dart │ │ │ │ ├── custom_video_event.dart │ │ │ │ ├── daily_aggregate_call_duration_report_response.dart │ │ │ │ ├── daily_aggregate_call_participant_count_report_response.dart │ │ │ │ ├── daily_aggregate_calls_per_day_report_response.dart │ │ │ │ ├── daily_aggregate_quality_score_report_response.dart │ │ │ │ ├── daily_aggregate_sdk_usage_report_response.dart │ │ │ │ ├── daily_aggregate_user_feedback_report_response.dart │ │ │ │ ├── delete_call_request.dart │ │ │ │ ├── delete_call_response.dart │ │ │ │ ├── delete_recording_response.dart │ │ │ │ ├── delete_transcription_response.dart │ │ │ │ ├── device_response.dart │ │ │ │ ├── edge_response.dart │ │ │ │ ├── egress_hls_response.dart │ │ │ │ ├── egress_response.dart │ │ │ │ ├── egress_rtmp_response.dart │ │ │ │ ├── end_call_response.dart │ │ │ │ ├── file_upload_config.dart │ │ │ │ ├── fps_stats.dart │ │ │ │ ├── frame_recording_response.dart │ │ │ │ ├── frame_recording_settings_request.dart │ │ │ │ ├── frame_recording_settings_response.dart │ │ │ │ ├── geofence_settings_request.dart │ │ │ │ ├── geofence_settings_response.dart │ │ │ │ ├── geolocation_result.dart │ │ │ │ ├── get_call_response.dart │ │ │ │ ├── get_call_stats_response.dart │ │ │ │ ├── get_edges_response.dart │ │ │ │ ├── get_or_create_call_request.dart │ │ │ │ ├── get_or_create_call_response.dart │ │ │ │ ├── go_live_request.dart │ │ │ │ ├── go_live_response.dart │ │ │ │ ├── health_check_event.dart │ │ │ │ ├── hls_settings_request.dart │ │ │ │ ├── hls_settings_response.dart │ │ │ │ ├── ice_server.dart │ │ │ │ ├── join_call_request.dart │ │ │ │ ├── join_call_response.dart │ │ │ │ ├── layout_settings_request.dart │ │ │ │ ├── limits_settings_request.dart │ │ │ │ ├── limits_settings_response.dart │ │ │ │ ├── list_devices_response.dart │ │ │ │ ├── list_recordings_response.dart │ │ │ │ ├── list_transcriptions_response.dart │ │ │ │ ├── location.dart │ │ │ │ ├── media_pub_sub_hint.dart │ │ │ │ ├── member_request.dart │ │ │ │ ├── member_response.dart │ │ │ │ ├── mute_users_request.dart │ │ │ │ ├── mute_users_response.dart │ │ │ │ ├── network_metrics_report_response.dart │ │ │ │ ├── noise_cancellation_settings.dart │ │ │ │ ├── own_capability.dart │ │ │ │ ├── own_user_response.dart │ │ │ │ ├── per_sdk_usage_report.dart │ │ │ │ ├── permission_request_event.dart │ │ │ │ ├── pin_request.dart │ │ │ │ ├── pin_response.dart │ │ │ │ ├── privacy_settings.dart │ │ │ │ ├── published_track_info.dart │ │ │ │ ├── publisher_aggregate_stats.dart │ │ │ │ ├── push_preferences.dart │ │ │ │ ├── quality_score_report.dart │ │ │ │ ├── quality_score_report_response.dart │ │ │ │ ├── query_aggregate_call_stats_request.dart │ │ │ │ ├── query_aggregate_call_stats_response.dart │ │ │ │ ├── query_call_members_request.dart │ │ │ │ ├── query_call_members_response.dart │ │ │ │ ├── query_call_stats_request.dart │ │ │ │ ├── query_call_stats_response.dart │ │ │ │ ├── query_calls_request.dart │ │ │ │ ├── query_calls_response.dart │ │ │ │ ├── reaction_response.dart │ │ │ │ ├── read_receipts.dart │ │ │ │ ├── record_settings_request.dart │ │ │ │ ├── record_settings_response.dart │ │ │ │ ├── reject_call_request.dart │ │ │ │ ├── reject_call_response.dart │ │ │ │ ├── report_by_histogram_bucket.dart │ │ │ │ ├── request_permission_request.dart │ │ │ │ ├── request_permission_response.dart │ │ │ │ ├── response.dart │ │ │ │ ├── ring_settings_request.dart │ │ │ │ ├── ring_settings_response.dart │ │ │ │ ├── rtmp_broadcast_request.dart │ │ │ │ ├── rtmp_ingress.dart │ │ │ │ ├── rtmp_settings_request.dart │ │ │ │ ├── rtmp_settings_response.dart │ │ │ │ ├── screensharing_settings_request.dart │ │ │ │ ├── screensharing_settings_response.dart │ │ │ │ ├── sdk_usage_report.dart │ │ │ │ ├── sdk_usage_report_response.dart │ │ │ │ ├── send_call_event_request.dart │ │ │ │ ├── send_call_event_response.dart │ │ │ │ ├── send_reaction_request.dart │ │ │ │ ├── send_reaction_response.dart │ │ │ │ ├── session_settings_request.dart │ │ │ │ ├── session_settings_response.dart │ │ │ │ ├── sfu_location_response.dart │ │ │ │ ├── sfu_response.dart │ │ │ │ ├── sort_param_request.dart │ │ │ │ ├── start_closed_captions_request.dart │ │ │ │ ├── start_closed_captions_response.dart │ │ │ │ ├── start_frame_recording_request.dart │ │ │ │ ├── start_frame_recording_response.dart │ │ │ │ ├── start_hls_broadcasting_response.dart │ │ │ │ ├── start_recording_request.dart │ │ │ │ ├── start_recording_response.dart │ │ │ │ ├── start_rtmp_broadcasts_request.dart │ │ │ │ ├── start_rtmp_broadcasts_response.dart │ │ │ │ ├── start_transcription_request.dart │ │ │ │ ├── start_transcription_response.dart │ │ │ │ ├── stats_options.dart │ │ │ │ ├── stop_all_rtmp_broadcasts_response.dart │ │ │ │ ├── stop_closed_captions_request.dart │ │ │ │ ├── stop_closed_captions_response.dart │ │ │ │ ├── stop_frame_recording_response.dart │ │ │ │ ├── stop_hls_broadcasting_response.dart │ │ │ │ ├── stop_live_request.dart │ │ │ │ ├── stop_live_response.dart │ │ │ │ ├── stop_recording_response.dart │ │ │ │ ├── stop_rtmp_broadcasts_response.dart │ │ │ │ ├── stop_transcription_request.dart │ │ │ │ ├── stop_transcription_response.dart │ │ │ │ ├── subsession.dart │ │ │ │ ├── target_resolution.dart │ │ │ │ ├── thumbnail_response.dart │ │ │ │ ├── thumbnails_settings_request.dart │ │ │ │ ├── thumbnails_settings_response.dart │ │ │ │ ├── time_stats.dart │ │ │ │ ├── transcription_settings_request.dart │ │ │ │ ├── transcription_settings_response.dart │ │ │ │ ├── turn_aggregated_stats.dart │ │ │ │ ├── typing_indicators.dart │ │ │ │ ├── unblock_user_request.dart │ │ │ │ ├── unblock_user_response.dart │ │ │ │ ├── unblocked_user_event.dart │ │ │ │ ├── unpin_request.dart │ │ │ │ ├── unpin_response.dart │ │ │ │ ├── update_call_members_request.dart │ │ │ │ ├── update_call_members_response.dart │ │ │ │ ├── update_call_request.dart │ │ │ │ ├── update_call_response.dart │ │ │ │ ├── update_user_permissions_request.dart │ │ │ │ ├── update_user_permissions_response.dart │ │ │ │ ├── updated_call_permissions_event.dart │ │ │ │ ├── user.dart │ │ │ │ ├── user_banned_event.dart │ │ │ │ ├── user_deactivated_event.dart │ │ │ │ ├── user_feedback_report.dart │ │ │ │ ├── user_feedback_report_response.dart │ │ │ │ ├── user_info_response.dart │ │ │ │ ├── user_muted_event.dart │ │ │ │ ├── user_reactivated_event.dart │ │ │ │ ├── user_request.dart │ │ │ │ ├── user_response.dart │ │ │ │ ├── user_response_privacy_fields.dart │ │ │ │ ├── user_session_stats.dart │ │ │ │ ├── user_stats.dart │ │ │ │ ├── user_updated_event.dart │ │ │ │ ├── video_dimension.dart │ │ │ │ ├── video_event.dart │ │ │ │ ├── video_quality.dart │ │ │ │ ├── video_settings_request.dart │ │ │ │ ├── video_settings_response.dart │ │ │ │ └── ws_auth_message.dart │ │ ├── protobuf │ │ │ ├── google │ │ │ │ └── protobuf │ │ │ │ │ ├── duration.pb.dart │ │ │ │ │ ├── duration.pbenum.dart │ │ │ │ │ ├── duration.pbjson.dart │ │ │ │ │ ├── duration.pbserver.dart │ │ │ │ │ ├── struct.pb.dart │ │ │ │ │ ├── struct.pbenum.dart │ │ │ │ │ ├── struct.pbjson.dart │ │ │ │ │ ├── struct.pbserver.dart │ │ │ │ │ ├── timestamp.pb.dart │ │ │ │ │ ├── timestamp.pbenum.dart │ │ │ │ │ ├── timestamp.pbjson.dart │ │ │ │ │ ├── timestamp.pbserver.dart │ │ │ │ │ ├── wrappers.pb.dart │ │ │ │ │ ├── wrappers.pbenum.dart │ │ │ │ │ ├── wrappers.pbjson.dart │ │ │ │ │ └── wrappers.pbserver.dart │ │ │ └── video │ │ │ │ └── sfu │ │ │ │ ├── event │ │ │ │ ├── events.pb.dart │ │ │ │ ├── events.pbenum.dart │ │ │ │ ├── events.pbjson.dart │ │ │ │ └── events.pbserver.dart │ │ │ │ ├── models │ │ │ │ ├── models.pb.dart │ │ │ │ ├── models.pbenum.dart │ │ │ │ ├── models.pbjson.dart │ │ │ │ └── models.pbserver.dart │ │ │ │ └── signal_rpc │ │ │ │ ├── signal.pb.dart │ │ │ │ ├── signal.pbenum.dart │ │ │ │ ├── signal.pbjson.dart │ │ │ │ ├── signal.pbserver.dart │ │ │ │ └── signal.pbtwirp.dart │ │ ├── src │ │ │ ├── audio_processing │ │ │ │ └── audio_processor.dart │ │ │ ├── call │ │ │ │ ├── call.dart │ │ │ │ ├── call_connect_options.dart │ │ │ │ ├── call_events.dart │ │ │ │ ├── call_reject_reason.dart │ │ │ │ ├── call_ringing_state.dart │ │ │ │ ├── call_type.dart │ │ │ │ ├── permissions │ │ │ │ │ └── permissions_manager.dart │ │ │ │ ├── session │ │ │ │ │ ├── call_session.dart │ │ │ │ │ ├── call_session_config.dart │ │ │ │ │ ├── call_session_factory.dart │ │ │ │ │ └── dynascale_manager.dart │ │ │ │ ├── state │ │ │ │ │ ├── call_state_notifier.dart │ │ │ │ │ └── mixins │ │ │ │ │ │ ├── state_call_actions_mixin.dart │ │ │ │ │ │ ├── state_coordinator_mixin.dart │ │ │ │ │ │ ├── state_lifecycle_mixin.dart │ │ │ │ │ │ ├── state_participant_mixin.dart │ │ │ │ │ │ ├── state_rtc_mixin.dart │ │ │ │ │ │ └── state_sfu_mixin.dart │ │ │ │ └── stats │ │ │ │ │ ├── sfu_stats_reporter.dart │ │ │ │ │ ├── stats_reporter.dart │ │ │ │ │ ├── trace_record.dart │ │ │ │ │ └── tracer.dart │ │ │ ├── call_state.dart │ │ │ ├── coordinator │ │ │ │ ├── coordinator_client.dart │ │ │ │ ├── models │ │ │ │ │ ├── coordinator_connection_state.dart │ │ │ │ │ ├── coordinator_events.dart │ │ │ │ │ └── coordinator_models.dart │ │ │ │ ├── open_api │ │ │ │ │ ├── coordinator_client_open_api.dart │ │ │ │ │ ├── coordinator_ws.dart │ │ │ │ │ ├── error │ │ │ │ │ │ ├── open_api_error.dart │ │ │ │ │ │ └── open_api_error_code.dart │ │ │ │ │ ├── event │ │ │ │ │ │ ├── event_type.dart │ │ │ │ │ │ ├── health_check.dart │ │ │ │ │ │ └── open_api_event.dart │ │ │ │ │ ├── open_api_extensions.dart │ │ │ │ │ └── open_api_mapper_extensions.dart │ │ │ │ └── retry │ │ │ │ │ └── coordinator_client_retry.dart │ │ │ ├── core │ │ │ │ ├── client_state.dart │ │ │ │ ├── connection_state.dart │ │ │ │ ├── utils.dart │ │ │ │ └── video_error.dart │ │ │ ├── disposable.dart │ │ │ ├── errors │ │ │ │ ├── video_error.dart │ │ │ │ └── video_error_composer.dart │ │ │ ├── events.dart │ │ │ ├── exceptions │ │ │ │ └── video_exception.dart │ │ │ ├── extensions │ │ │ │ ├── call_participant_state_ext.dart │ │ │ │ └── thermal_status_ext.dart │ │ │ ├── internal │ │ │ │ └── _instance_holder.dart │ │ │ ├── latency │ │ │ │ ├── latency_service.dart │ │ │ │ └── latency_settings.dart │ │ │ ├── lifecycle │ │ │ │ ├── lifecycle_state.dart │ │ │ │ ├── lifecycle_utils.dart │ │ │ │ └── lifecycle_utils_io.dart │ │ │ ├── location │ │ │ │ └── location_service.dart │ │ │ ├── logger │ │ │ │ ├── impl │ │ │ │ │ ├── console_logger.dart │ │ │ │ │ ├── external_logger.dart │ │ │ │ │ ├── file_logger.dart │ │ │ │ │ └── tagged_logger.dart │ │ │ │ ├── stream_log.dart │ │ │ │ └── stream_logger.dart │ │ │ ├── models │ │ │ │ ├── call_cid.dart │ │ │ │ ├── call_client_publish_options.dart │ │ │ │ ├── call_closed_caption.dart │ │ │ │ ├── call_created_data.dart │ │ │ │ ├── call_credentials.dart │ │ │ │ ├── call_egress.dart │ │ │ │ ├── call_joined_data.dart │ │ │ │ ├── call_member_state.dart │ │ │ │ ├── call_metadata.dart │ │ │ │ ├── call_participant_pin.dart │ │ │ │ ├── call_participant_state.dart │ │ │ │ ├── call_permission.dart │ │ │ │ ├── call_preferences.dart │ │ │ │ ├── call_reaction.dart │ │ │ │ ├── call_received_created_data.dart │ │ │ │ ├── call_received_data.dart │ │ │ │ ├── call_ringing_data.dart │ │ │ │ ├── call_session_data.dart │ │ │ │ ├── call_settings.dart │ │ │ │ ├── call_stats.dart │ │ │ │ ├── call_status.dart │ │ │ │ ├── call_track_state.dart │ │ │ │ ├── disconnect_reason.dart │ │ │ │ ├── guest_created_data.dart │ │ │ │ ├── models.dart │ │ │ │ ├── push_device.dart │ │ │ │ ├── push_provider.dart │ │ │ │ ├── queried_calls.dart │ │ │ │ ├── queried_members.dart │ │ │ │ ├── subscription_change.dart │ │ │ │ ├── user.dart │ │ │ │ ├── user_info.dart │ │ │ │ ├── viewport_visibility.dart │ │ │ │ └── visibility_change.dart │ │ │ ├── network_monitor_settings.dart │ │ │ ├── platform_detector │ │ │ │ ├── platform_detector.dart │ │ │ │ ├── platform_detector_io.dart │ │ │ │ ├── platform_detector_stub.dart │ │ │ │ └── platform_detector_web.dart │ │ │ ├── push_notification │ │ │ │ ├── call_kit_events.dart │ │ │ │ └── push_notification_manager.dart │ │ │ ├── retry │ │ │ │ ├── retry_manager.dart │ │ │ │ └── retry_policy.dart │ │ │ ├── sfu │ │ │ │ ├── data │ │ │ │ │ ├── events │ │ │ │ │ │ ├── sfu_event_mapper_extensions.dart │ │ │ │ │ │ └── sfu_events.dart │ │ │ │ │ └── models │ │ │ │ │ │ ├── sfu_audio_level.dart │ │ │ │ │ │ ├── sfu_audio_sender.dart │ │ │ │ │ │ ├── sfu_call_ended_reason.dart │ │ │ │ │ │ ├── sfu_call_grants.dart │ │ │ │ │ │ ├── sfu_call_state.dart │ │ │ │ │ │ ├── sfu_codec.dart │ │ │ │ │ │ ├── sfu_connection_info.dart │ │ │ │ │ │ ├── sfu_connection_quality.dart │ │ │ │ │ │ ├── sfu_error.dart │ │ │ │ │ │ ├── sfu_goaway_reason.dart │ │ │ │ │ │ ├── sfu_model_mapper_extensions.dart │ │ │ │ │ │ ├── sfu_model_parser.dart │ │ │ │ │ │ ├── sfu_participant.dart │ │ │ │ │ │ ├── sfu_pin.dart │ │ │ │ │ │ ├── sfu_publish_options.dart │ │ │ │ │ │ ├── sfu_subscription_details.dart │ │ │ │ │ │ ├── sfu_track_type.dart │ │ │ │ │ │ ├── sfu_video_layer_setting.dart │ │ │ │ │ │ └── sfu_video_sender.dart │ │ │ │ ├── sfu_client.dart │ │ │ │ ├── sfu_extensions.dart │ │ │ │ └── ws │ │ │ │ │ └── sfu_ws.dart │ │ │ ├── shared_emitter.dart │ │ │ ├── sorting │ │ │ │ ├── call_participant_sorting_presets.dart │ │ │ │ └── call_participant_state_sorting.dart │ │ │ ├── state_emitter.dart │ │ │ ├── stream_video.dart │ │ │ ├── token │ │ │ │ ├── token.dart │ │ │ │ └── token_manager.dart │ │ │ ├── types │ │ │ │ └── other.dart │ │ │ ├── utils │ │ │ │ ├── cancelable_operation.dart │ │ │ │ ├── cancelables.dart │ │ │ │ ├── completer.dart │ │ │ │ ├── debounce_buffer.dart │ │ │ │ ├── extensions.dart │ │ │ │ ├── format.dart │ │ │ │ ├── future.dart │ │ │ │ ├── iterable.dart │ │ │ │ ├── list.dart │ │ │ │ ├── none.dart │ │ │ │ ├── pair.dart │ │ │ │ ├── result.dart │ │ │ │ ├── standard.dart │ │ │ │ ├── stream.dart │ │ │ │ ├── string.dart │ │ │ │ ├── subscriptions.dart │ │ │ │ └── triple.dart │ │ │ ├── webrtc │ │ │ │ ├── codecs_helper.dart │ │ │ │ ├── media │ │ │ │ │ ├── audio_constraints.dart │ │ │ │ │ ├── camera_constraints.dart │ │ │ │ │ ├── constraints │ │ │ │ │ │ ├── camera_position.dart │ │ │ │ │ │ ├── facing_mode.dart │ │ │ │ │ │ └── mirror_mode.dart │ │ │ │ │ ├── media_constraints.dart │ │ │ │ │ ├── screen_share_constraints.dart │ │ │ │ │ └── video_constraints.dart │ │ │ │ ├── model │ │ │ │ │ ├── rtc_audio_bitrate_preset.dart │ │ │ │ │ ├── rtc_model_mapper_extensions.dart │ │ │ │ │ ├── rtc_tracks_info.dart │ │ │ │ │ ├── rtc_video_dimension.dart │ │ │ │ │ ├── rtc_video_encoding.dart │ │ │ │ │ ├── rtc_video_parameters.dart │ │ │ │ │ └── stats │ │ │ │ │ │ ├── rtc_audio_source.dart │ │ │ │ │ │ ├── rtc_codec.dart │ │ │ │ │ │ ├── rtc_ice_candidate.dart │ │ │ │ │ │ ├── rtc_ice_candidate_pair.dart │ │ │ │ │ │ ├── rtc_inbound_rtp.dart │ │ │ │ │ │ ├── rtc_inbound_rtp_audio_stream.dart │ │ │ │ │ │ ├── rtc_inbound_rtp_video_stream.dart │ │ │ │ │ │ ├── rtc_media_source.dart │ │ │ │ │ │ ├── rtc_media_stream_track.dart │ │ │ │ │ │ ├── rtc_media_stream_track_local_audio.dart │ │ │ │ │ │ ├── rtc_media_stream_track_local_video.dart │ │ │ │ │ │ ├── rtc_media_stream_track_receiver_audio.dart │ │ │ │ │ │ ├── rtc_media_stream_track_remote_video.dart │ │ │ │ │ │ ├── rtc_outbound_rtp.dart │ │ │ │ │ │ ├── rtc_outbound_rtp_audio_stream.dart │ │ │ │ │ │ ├── rtc_outbound_rtp_video_stream.dart │ │ │ │ │ │ ├── rtc_printable_stats.dart │ │ │ │ │ │ ├── rtc_raw_stats.dart │ │ │ │ │ │ ├── rtc_remote_inbound_rtp.dart │ │ │ │ │ │ ├── rtc_remote_inbound_rtp_audio_stream.dart │ │ │ │ │ │ ├── rtc_remote_inbound_rtp_video_stream.dart │ │ │ │ │ │ ├── rtc_report_type.dart │ │ │ │ │ │ ├── rtc_stats.dart │ │ │ │ │ │ ├── rtc_stats_mapper.dart │ │ │ │ │ │ ├── rtc_stats_property.dart │ │ │ │ │ │ ├── rtc_video_source.dart │ │ │ │ │ │ └── rtc_writable.dart │ │ │ │ ├── peer_connection.dart │ │ │ │ ├── peer_connection_factory.dart │ │ │ │ ├── peer_type.dart │ │ │ │ ├── rtc_audio_api │ │ │ │ │ ├── rtc_audio_api.dart │ │ │ │ │ ├── rtc_audio_html.dart │ │ │ │ │ ├── rtc_audio_native.dart │ │ │ │ │ └── rtc_audio_stub.dart │ │ │ │ ├── rtc_manager.dart │ │ │ │ ├── rtc_manager_factory.dart │ │ │ │ ├── rtc_media_device │ │ │ │ │ ├── rtc_media_device.dart │ │ │ │ │ └── rtc_media_device_notifier.dart │ │ │ │ ├── rtc_parser.dart │ │ │ │ ├── rtc_track │ │ │ │ │ ├── rtc_local_track.dart │ │ │ │ │ ├── rtc_remote_track.dart │ │ │ │ │ └── rtc_track.dart │ │ │ │ ├── sdp │ │ │ │ │ ├── attributes │ │ │ │ │ │ ├── fmtp.dart │ │ │ │ │ │ └── rtpmap.dart │ │ │ │ │ ├── codec │ │ │ │ │ │ └── sdp_codec.dart │ │ │ │ │ ├── editor │ │ │ │ │ │ ├── action │ │ │ │ │ │ │ ├── action_prioritize_codec.dart │ │ │ │ │ │ │ ├── action_set_opus_dtx_enabled.dart │ │ │ │ │ │ │ ├── action_set_opus_red_enabled.dart │ │ │ │ │ │ │ ├── sdp_edit_action.dart │ │ │ │ │ │ │ └── sdp_edit_action_factory.dart │ │ │ │ │ │ ├── rule │ │ │ │ │ │ │ ├── rule_prioritize_codec.dart │ │ │ │ │ │ │ ├── rule_set_opus_dtx_enabled.dart │ │ │ │ │ │ │ ├── rule_set_opus_red_enabled.dart │ │ │ │ │ │ │ ├── rule_toggle.dart │ │ │ │ │ │ │ └── sdp_munging_rule.dart │ │ │ │ │ │ ├── sdp_editor.dart │ │ │ │ │ │ └── sdp_editor_impl.dart │ │ │ │ │ ├── policy │ │ │ │ │ │ └── sdp_policy.dart │ │ │ │ │ ├── sdp.dart │ │ │ │ │ └── specification │ │ │ │ │ │ └── media_description.dart │ │ │ │ ├── traced_peer_connection.dart │ │ │ │ └── transceiver_cache.dart │ │ │ └── ws │ │ │ │ ├── connect │ │ │ │ ├── connect.dart │ │ │ │ ├── connect_html.dart │ │ │ │ └── connect_io.dart │ │ │ │ ├── health │ │ │ │ └── health_monitor.dart │ │ │ │ ├── socket_connection_state.dart │ │ │ │ └── ws.dart │ │ └── stream_video.dart │ ├── pubspec.yaml │ └── test │ │ ├── call_participant_state_sorting_test.dart │ │ ├── fixtures │ │ └── sdp-fixture.json │ │ ├── src │ │ ├── call │ │ │ ├── call_allow_multiple_active_calls_test.dart │ │ │ ├── call_apply_settings_test.dart │ │ │ └── call_type_test.dart │ │ ├── core │ │ │ └── client_state_test.dart │ │ ├── globals_test.dart │ │ ├── latency │ │ │ ├── latency_client_mock.dart │ │ │ └── latency_service_test.dart │ │ ├── logger │ │ │ └── impl │ │ │ │ └── test_logger.dart │ │ ├── types │ │ │ └── rtc_configuration_test.dart │ │ └── utils │ │ │ └── debounce_buffer_test.dart │ │ └── test_helpers.dart ├── stream_video_flutter │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── android │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── settings.gradle │ │ └── src │ │ │ ├── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── kotlin │ │ │ │ ├── flutter │ │ │ │ │ └── embedding │ │ │ │ │ │ └── android │ │ │ │ │ │ ├── FlutterEngine.kt │ │ │ │ │ │ └── FlutterFlags.kt │ │ │ │ └── io │ │ │ │ │ └── getstream │ │ │ │ │ └── video │ │ │ │ │ └── flutter │ │ │ │ │ └── stream_video_flutter │ │ │ │ │ ├── MethodCallHandlerImpl.kt │ │ │ │ │ ├── StreamFlags.kt │ │ │ │ │ ├── StreamVideoFlutterPlugin.kt │ │ │ │ │ ├── service │ │ │ │ │ ├── PictureInPictureHelper.kt │ │ │ │ │ ├── ServiceManager.kt │ │ │ │ │ ├── StreamCallService.kt │ │ │ │ │ ├── StreamScreenShareService.kt │ │ │ │ │ ├── notification │ │ │ │ │ │ ├── NotificationAction.kt │ │ │ │ │ │ ├── NotificationActionBuilder.kt │ │ │ │ │ │ ├── NotificationActionBuilderImpl.kt │ │ │ │ │ │ ├── NotificationActionReceiver.kt │ │ │ │ │ │ ├── NotificationActionUtils.kt │ │ │ │ │ │ ├── NotificationOptions.kt │ │ │ │ │ │ ├── StreamCallGuid.kt │ │ │ │ │ │ ├── StreamNotificationBuilder.kt │ │ │ │ │ │ ├── StreamNotificationBuilderImpl.kt │ │ │ │ │ │ └── image │ │ │ │ │ │ │ ├── CircleTransform.kt │ │ │ │ │ │ │ ├── CustomTarget.kt │ │ │ │ │ │ │ └── DefaultTarget.kt │ │ │ │ │ └── utils │ │ │ │ │ │ ├── AndroidUtils.kt │ │ │ │ │ │ └── SharedPreferencesUtils.kt │ │ │ │ │ └── videoFilters │ │ │ │ │ ├── common │ │ │ │ │ ├── BitmapVideoFilter.kt │ │ │ │ │ ├── FilterUtils.kt │ │ │ │ │ ├── VideoFrameWithBitmapFilter.kt │ │ │ │ │ └── YuvFrame.kt │ │ │ │ │ └── factories │ │ │ │ │ ├── BackgroundBlurFactory.kt │ │ │ │ │ └── VirtualBackgroundFactory.kt │ │ │ └── res │ │ │ │ ├── drawable-hdpi │ │ │ │ └── stream_ic_cancel.png │ │ │ │ ├── drawable-mdpi │ │ │ │ └── stream_ic_cancel.png │ │ │ │ ├── drawable-v21 │ │ │ │ ├── stream_bg_button_cancel.xml │ │ │ │ └── stream_rounded_button_cancel.xml │ │ │ │ ├── drawable-xhdpi │ │ │ │ └── stream_ic_cancel.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ └── stream_ic_cancel.png │ │ │ │ ├── drawable-xxxhdpi │ │ │ │ └── stream_ic_cancel.png │ │ │ │ ├── drawable │ │ │ │ ├── stream_bg_button_cancel.xml │ │ │ │ ├── stream_rounded_button_cancel.xml │ │ │ │ ├── stream_video_ic_call.xml │ │ │ │ ├── stream_video_ic_cancel_screenshare.xml │ │ │ │ └── stream_video_ic_screenshare.xml │ │ │ │ ├── layout │ │ │ │ ├── stream_notification_large.xml │ │ │ │ ├── stream_notification_small.xml │ │ │ │ └── stream_notification_small_ex.xml │ │ │ │ └── values │ │ │ │ ├── stream_colors.xml │ │ │ │ ├── stream_dimens.xml │ │ │ │ ├── stream_ids.xml │ │ │ │ └── stream_strings.xml │ │ │ └── test │ │ │ └── kotlin │ │ │ └── com │ │ │ └── example │ │ │ └── stream_video_flutter │ │ │ └── StreamVideoFlutterPluginTest.kt │ ├── example │ │ ├── .metadata │ │ ├── README.md │ │ ├── android │ │ │ ├── .gitignore │ │ │ ├── app │ │ │ │ ├── build.gradle │ │ │ │ ├── google-services.json │ │ │ │ ├── proguard-rules.pro │ │ │ │ └── src │ │ │ │ │ ├── debug │ │ │ │ │ └── AndroidManifest.xml │ │ │ │ │ ├── main │ │ │ │ │ ├── AndroidManifest.xml │ │ │ │ │ ├── kotlin │ │ │ │ │ │ └── io │ │ │ │ │ │ │ └── getstream │ │ │ │ │ │ │ └── video │ │ │ │ │ │ │ └── flutter │ │ │ │ │ │ │ └── dogfooding │ │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ │ └── res │ │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ ├── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ │ ├── values-night │ │ │ │ │ │ └── styles.xml │ │ │ │ │ │ └── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── profile │ │ │ │ │ └── AndroidManifest.xml │ │ │ ├── build.gradle │ │ │ ├── gradle.properties │ │ │ ├── gradle │ │ │ │ └── wrapper │ │ │ │ │ └── gradle-wrapper.properties │ │ │ └── settings.gradle │ │ ├── ios │ │ │ ├── .gitignore │ │ │ ├── Flutter │ │ │ │ ├── AppFrameworkInfo.plist │ │ │ │ ├── Debug.xcconfig │ │ │ │ └── Release.xcconfig │ │ │ ├── Podfile │ │ │ ├── Runner.xcodeproj │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace │ │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ │ └── xcshareddata │ │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ │ └── xcshareddata │ │ │ │ │ └── xcschemes │ │ │ │ │ └── Runner.xcscheme │ │ │ ├── Runner.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata │ │ │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ │ │ └── WorkspaceSettings.xcsettings │ │ │ ├── Runner │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Assets.xcassets │ │ │ │ │ ├── AppIcon.appiconset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ │ │ │ └── LaunchImage.imageset │ │ │ │ │ │ ├── Contents.json │ │ │ │ │ │ ├── LaunchImage.png │ │ │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ │ │ └── README.md │ │ │ │ ├── Base.lproj │ │ │ │ │ ├── LaunchScreen.storyboard │ │ │ │ │ └── Main.storyboard │ │ │ │ ├── Info.plist │ │ │ │ └── Runner-Bridging-Header.h │ │ │ └── RunnerTests │ │ │ │ └── RunnerTests.swift │ │ ├── lib │ │ │ ├── app.dart │ │ │ ├── app_config.dart │ │ │ ├── core │ │ │ │ ├── auth_repository.dart │ │ │ │ └── token_service.dart │ │ │ ├── env │ │ │ │ └── env.dart │ │ │ ├── firebase_options.dart │ │ │ ├── log_config.dart │ │ │ ├── main.dart │ │ │ ├── model │ │ │ │ └── credentials.dart │ │ │ ├── proxy │ │ │ │ └── proxy.dart │ │ │ ├── screen │ │ │ │ ├── home_screen.dart │ │ │ │ ├── home_tabs │ │ │ │ │ ├── call_text_field.dart │ │ │ │ │ ├── join_call_tab.dart │ │ │ │ │ └── start_call_tab.dart │ │ │ │ └── login_screen.dart │ │ │ ├── stream_video_options.dart │ │ │ ├── stream_video_sdk.dart │ │ │ └── utils.dart │ │ ├── linux │ │ │ ├── CMakeLists.txt │ │ │ ├── flutter │ │ │ │ ├── CMakeLists.txt │ │ │ │ ├── generated_plugin_registrant.cc │ │ │ │ ├── generated_plugin_registrant.h │ │ │ │ └── generated_plugins.cmake │ │ │ ├── main.cc │ │ │ ├── my_application.cc │ │ │ └── my_application.h │ │ ├── macos │ │ │ ├── Flutter │ │ │ │ ├── Flutter-Debug.xcconfig │ │ │ │ └── Flutter-Release.xcconfig │ │ │ ├── Podfile │ │ │ ├── Runner.xcodeproj │ │ │ │ ├── project.pbxproj │ │ │ │ ├── project.xcworkspace │ │ │ │ │ └── xcshareddata │ │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ │ └── xcshareddata │ │ │ │ │ └── xcschemes │ │ │ │ │ └── Runner.xcscheme │ │ │ ├── Runner.xcworkspace │ │ │ │ ├── contents.xcworkspacedata │ │ │ │ └── xcshareddata │ │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── Runner │ │ │ │ ├── AppDelegate.swift │ │ │ │ ├── Assets.xcassets │ │ │ │ └── AppIcon.appiconset │ │ │ │ │ ├── Contents.json │ │ │ │ │ ├── app_icon_1024.png │ │ │ │ │ ├── app_icon_128.png │ │ │ │ │ ├── app_icon_16.png │ │ │ │ │ ├── app_icon_256.png │ │ │ │ │ ├── app_icon_32.png │ │ │ │ │ ├── app_icon_512.png │ │ │ │ │ └── app_icon_64.png │ │ │ │ ├── Base.lproj │ │ │ │ └── MainMenu.xib │ │ │ │ ├── Configs │ │ │ │ ├── AppInfo.xcconfig │ │ │ │ ├── Debug.xcconfig │ │ │ │ ├── Release.xcconfig │ │ │ │ └── Warnings.xcconfig │ │ │ │ ├── DebugProfile.entitlements │ │ │ │ ├── Info.plist │ │ │ │ ├── MainFlutterWindow.swift │ │ │ │ └── Release.entitlements │ │ ├── pubspec.yaml │ │ ├── web │ │ │ ├── favicon.png │ │ │ ├── icons │ │ │ │ ├── Icon-192.png │ │ │ │ ├── Icon-512.png │ │ │ │ ├── Icon-maskable-192.png │ │ │ │ └── Icon-maskable-512.png │ │ │ ├── index.html │ │ │ └── manifest.json │ │ └── windows │ │ │ ├── CMakeLists.txt │ │ │ ├── flutter │ │ │ ├── CMakeLists.txt │ │ │ └── generated_plugins.cmake │ │ │ └── runner │ │ │ ├── CMakeLists.txt │ │ │ ├── Runner.rc │ │ │ ├── flutter_window.cpp │ │ │ ├── flutter_window.h │ │ │ ├── main.cpp │ │ │ ├── resource.h │ │ │ ├── resources │ │ │ └── app_icon.ico │ │ │ ├── runner.exe.manifest │ │ │ ├── utils.cpp │ │ │ ├── utils.h │ │ │ ├── win32_window.cpp │ │ │ └── win32_window.h │ ├── fonts │ │ └── StreamIcons.ttf │ ├── images │ │ └── call_background.jpg │ ├── ios │ │ ├── .gitignore │ │ ├── Assets │ │ │ └── .gitkeep │ │ ├── Classes │ │ │ ├── PictureInPicture │ │ │ │ ├── SampleBufferVideoCallView.swift │ │ │ │ ├── StreamAVPictureInPictureVideoCallViewController.swift │ │ │ │ ├── StreamBufferTransformer.swift │ │ │ │ ├── StreamPictureInPictureController.swift │ │ │ │ ├── StreamPictureInPictureTrackStateAdapter.swift │ │ │ │ ├── StreamPictureInPictureVideoRenderer.swift │ │ │ │ ├── StreamPixelBufferPool.swift │ │ │ │ ├── StreamPixelBufferRepository.swift │ │ │ │ ├── StreamRTCYUVBuffer.swift │ │ │ │ ├── StreamYUVToARGBConversion.swift │ │ │ │ ├── WindowSizePolicy │ │ │ │ │ ├── StreamPictureInPictureAdaptiveWindowSizePolicy.swift │ │ │ │ │ ├── StreamPictureInPictureFixedWindowSizePolicy.swift │ │ │ │ │ └── StreamPictureInPictureWindowSizePolicy.swift │ │ │ │ └── YpCbCrPixelRange+Default.swift │ │ │ ├── StreamVideoFlutterPlugin.swift │ │ │ └── VideoFrameProcessors │ │ │ │ ├── BlurBackgroundVideoFrameProcessor.swift │ │ │ │ ├── ImageBackgroundVideoFrameProcessor.swift │ │ │ │ └── Utils │ │ │ │ ├── BackgroundImageFilterProcessor.swift │ │ │ │ ├── CIImage+Resize.swift │ │ │ │ ├── UIDevice+NeuralEngine.swift │ │ │ │ └── VideoFilters.swift │ │ └── stream_video_flutter.podspec │ ├── l10n.yaml │ ├── lib │ │ ├── src │ │ │ ├── call_background │ │ │ │ ├── background_service.dart │ │ │ │ └── model │ │ │ │ │ ├── notification_options.dart │ │ │ │ │ ├── notification_payload.dart │ │ │ │ │ └── service_type.dart │ │ │ ├── call_controls │ │ │ │ ├── call_control_option.dart │ │ │ │ ├── call_controls.dart │ │ │ │ └── controls │ │ │ │ │ ├── add_reaction_option.dart │ │ │ │ │ ├── default_control_options.dart │ │ │ │ │ ├── flip_camera_option.dart │ │ │ │ │ ├── leave_call_option.dart │ │ │ │ │ ├── toggle_camera_option.dart │ │ │ │ │ ├── toggle_closed_captions_option.dart │ │ │ │ │ ├── toggle_layout_option.dart │ │ │ │ │ ├── toggle_microphone_option.dart │ │ │ │ │ ├── toggle_recording_option.dart │ │ │ │ │ ├── toggle_screen_sharing_option.dart │ │ │ │ │ └── toggle_speakerphone_option.dart │ │ │ ├── call_participants │ │ │ │ ├── call_participant.dart │ │ │ │ ├── call_participants.dart │ │ │ │ ├── indicators │ │ │ │ │ ├── audio_indicator.dart │ │ │ │ │ ├── audio_level_indicator.dart │ │ │ │ │ └── connection_quality_indicator.dart │ │ │ │ ├── layout │ │ │ │ │ ├── call_participants_grid_view.dart │ │ │ │ │ ├── call_participants_spotlight_view.dart │ │ │ │ │ └── participant_layout_mode.dart │ │ │ │ ├── local_video.dart │ │ │ │ ├── overlay_app_bar.dart │ │ │ │ ├── participant_label.dart │ │ │ │ ├── regular_call_participants_content.dart │ │ │ │ └── screen_share_call_participants_content.dart │ │ │ ├── call_screen │ │ │ │ ├── call_container.dart │ │ │ │ ├── call_content │ │ │ │ │ ├── call_app_bar.dart │ │ │ │ │ ├── call_content.dart │ │ │ │ │ └── picture_in_picture │ │ │ │ │ │ ├── picture_in_picture_configuration.dart │ │ │ │ │ │ └── stream_picture_in_picture_ui_kit_view.dart │ │ │ │ ├── call_diagnostics_content │ │ │ │ │ └── call_diagnostics_content.dart │ │ │ │ ├── common │ │ │ │ │ ├── call_background.dart │ │ │ │ │ ├── calling_participants.dart │ │ │ │ │ └── participant_avatars.dart │ │ │ │ ├── incoming_call │ │ │ │ │ ├── incoming_call_content.dart │ │ │ │ │ └── incoming_call_controls.dart │ │ │ │ ├── lobby_participants_view.dart │ │ │ │ ├── lobby_video.dart │ │ │ │ ├── lobby_view.dart │ │ │ │ └── outgoing_call │ │ │ │ │ ├── outgoing_call_content.dart │ │ │ │ │ └── outgoing_call_controls.dart │ │ │ ├── l10n │ │ │ │ ├── arb │ │ │ │ │ ├── stream_video_flutter_en.arb │ │ │ │ │ └── stream_video_flutter_nl.arb │ │ │ │ ├── custom_stream_video_localizations_delegate.dart │ │ │ │ ├── localization_extension.dart │ │ │ │ └── localizations │ │ │ │ │ ├── stream_video_flutter_localizations.dart │ │ │ │ │ ├── stream_video_flutter_localizations_en.dart │ │ │ │ │ └── stream_video_flutter_localizations_nl.dart │ │ │ ├── livestream │ │ │ │ ├── livestream_backstage_content.dart │ │ │ │ ├── livestream_content.dart │ │ │ │ ├── livestream_ended_content.dart │ │ │ │ ├── livestream_info.dart │ │ │ │ ├── livestream_player.dart │ │ │ │ └── livestream_speakerphone_option.dart │ │ │ ├── models │ │ │ │ ├── mute_toggle_titles.dart │ │ │ │ └── stream_icon_toggle.dart │ │ │ ├── renderer │ │ │ │ └── video_renderer.dart │ │ │ ├── screen_share │ │ │ │ ├── desktop_screen_selector.dart │ │ │ │ ├── screen_selector_state_notifier.dart │ │ │ │ ├── screen_share.dart │ │ │ │ ├── screen_share_logger.dart │ │ │ │ └── screen_share_thumbnail_widget.dart │ │ │ ├── theme │ │ │ │ ├── call_content_theme.dart │ │ │ │ ├── call_controls_theme.dart │ │ │ │ ├── call_participant_theme.dart │ │ │ │ ├── incoming_outgoing_call_theme.dart │ │ │ │ ├── lobby_view_theme.dart │ │ │ │ ├── local_video_theme.dart │ │ │ │ ├── stream_color_theme.dart │ │ │ │ ├── stream_icons.dart │ │ │ │ ├── stream_livestream_theme.dart │ │ │ │ ├── stream_text_theme.dart │ │ │ │ ├── stream_video_theme.dart │ │ │ │ ├── themes.dart │ │ │ │ └── user_avatar_theme.dart │ │ │ ├── utils │ │ │ │ ├── device_segmentation.dart │ │ │ │ └── extensions.dart │ │ │ ├── video_effects │ │ │ │ └── video_effects_manager.dart │ │ │ └── widgets │ │ │ │ ├── floating_view │ │ │ │ ├── floating_view_alignment.dart │ │ │ │ ├── floating_view_container.dart │ │ │ │ ├── simple_floating_view.dart │ │ │ │ └── snapping_floating_view.dart │ │ │ │ ├── size_change_listener.dart │ │ │ │ ├── stream_user_avatar.dart │ │ │ │ └── tile_view.dart │ │ ├── stream_video_flutter.dart │ │ ├── stream_video_flutter_background.dart │ │ ├── stream_video_flutter_l10n.dart │ │ ├── stream_video_flutter_method_channel.dart │ │ └── stream_video_flutter_platform_interface.dart │ ├── pubspec.yaml │ └── test │ │ ├── flutter_test_config.dart │ │ ├── src │ │ ├── call_controls │ │ │ └── controls │ │ │ │ └── toggle_microphone_option_test.dart │ │ └── call_screen │ │ │ └── call_content │ │ │ ├── call_content_test.dart │ │ │ └── goldens │ │ │ └── ci │ │ │ ├── stream_call_content_extend_body_false.png │ │ │ └── stream_call_content_extend_body_true.png │ │ └── test_utils │ │ └── test_wrapper.dart ├── stream_video_noise_cancellation │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin │ │ │ └── io │ │ │ └── getstream │ │ │ └── video │ │ │ └── flutter │ │ │ └── stream_video_noise_cancellation │ │ │ ├── NoiseCancellationAudioProcessingController.kt │ │ │ └── StreamVideoNoiseCancellationPlugin.kt │ ├── ios │ │ ├── .gitignore │ │ ├── Assets │ │ │ └── .gitkeep │ │ ├── Classes │ │ │ ├── AudioFilters.swift │ │ │ ├── NeuralEngineProvider.swift │ │ │ ├── NoiseCancellationFilter.swift │ │ │ ├── StreamAudioFilterCapturePostProcessingModule.swift │ │ │ ├── StreamAudioProcessingModule.swift │ │ │ └── StreamVideoNoiseCancellationPlugin.swift │ │ ├── Resources │ │ │ └── PrivacyInfo.xcprivacy │ │ └── stream_video_noise_cancellation.podspec │ ├── lib │ │ ├── noise_cancellation_audio_processor.dart │ │ ├── stream_video_noise_cancellation.dart │ │ ├── stream_video_noise_cancellation_method_channel.dart │ │ └── stream_video_noise_cancellation_platform_interface.dart │ ├── pubspec.yaml │ └── test │ │ ├── mock_noise_cancellation_platform.dart │ │ └── noise_cancellation_audio_processor_test.dart ├── stream_video_push_notification │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── android │ │ ├── .gitignore │ │ ├── build.gradle │ │ ├── gradle │ │ │ └── wrapper │ │ │ │ └── gradle-wrapper.properties │ │ ├── settings.gradle │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── kotlin │ │ │ └── io │ │ │ └── getstream │ │ │ └── video │ │ │ └── flutter │ │ │ └── stream_video_push_notification │ │ │ └── StreamVideoPushNotificationPlugin.kt │ ├── ios │ │ ├── .gitignore │ │ ├── Assets │ │ │ └── .gitkeep │ │ ├── Classes │ │ │ ├── StreamVideoPKDelegateManager.swift │ │ │ ├── StreamVideoPushNotificationPlugin.swift │ │ │ └── StreamVideoPushParams.swift │ │ └── stream_video_push_notification.podspec │ ├── lib │ │ ├── src │ │ │ ├── stream_video_push_notification.dart │ │ │ ├── stream_video_push_params.dart │ │ │ ├── stream_video_push_params.g.dart │ │ │ └── stream_video_push_provider.dart │ │ ├── stream_video_push_notification.dart │ │ ├── stream_video_push_notification_method_channel.dart │ │ └── stream_video_push_notification_platform_interface.dart │ └── pubspec.yaml └── stream_video_screen_sharing │ ├── .gitignore │ ├── .metadata │ ├── CHANGELOG.md │ ├── LICENSE │ ├── README.md │ ├── analysis_options.yaml │ ├── ios │ ├── .gitignore │ ├── Assets │ │ └── .gitkeep │ ├── Classes │ │ ├── Atomic.swift │ │ ├── BroadcastSampleHandler.swift │ │ ├── BroadcastSampleUploader.swift │ │ ├── SocketConnection.swift │ │ └── StreamVideoScreenSharingPlugin.swift │ └── stream_video_screen_sharing.podspec │ ├── lib │ ├── stream_video_screen_sharing_method_channel.dart │ └── stream_video_screen_sharing_platform_interface.dart │ └── pubspec.yaml ├── pubspec.lock └── pubspec.yaml /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Default owner for everything in the repo 2 | * @GetStream/flutter-developers 3 | -------------------------------------------------------------------------------- /.github/workflows/scripts/remove-from-coverage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Fast fail the script on failures. 4 | set -e 5 | 6 | flutter pub global run remove_from_coverage:remove_from_coverage -f coverage/lcov.info -r '\.g\.dart$' -r '\.freezed\.dart$' 7 | -------------------------------------------------------------------------------- /.readme-assets/Github-Graphic-Flutter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/.readme-assets/Github-Graphic-Flutter.jpg -------------------------------------------------------------------------------- /.run/dogfooding.run.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | -------------------------------------------------------------------------------- /dogfooding/android/.ruby-version: -------------------------------------------------------------------------------- 1 | 3.1.0 -------------------------------------------------------------------------------- /dogfooding/android/.sign/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/.sign/debug.keystore -------------------------------------------------------------------------------- /dogfooding/android/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | 5 | plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 6 | eval_gemfile(plugins_path) if File.exist?(plugins_path) 7 | -------------------------------------------------------------------------------- /dogfooding/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #Flutter Wrapper 2 | -keep class io.flutter.plugin.** { *; } 3 | -keep class io.flutter.util.** { *; } 4 | -keep class io.flutter.view.** { *; } 5 | -keep class io.flutter.plugins.** { *; } 6 | 7 | -keep class com.hiennv.flutter_callkit_incoming.** { *; } 8 | 9 | -keep class java.beans.Transient.** {*;} 10 | -keep class java.beans.ConstructorProperties.** {*;} 11 | -keep class java.nio.file.Path.** {*;} 12 | 13 | -dontwarn java.beans.ConstructorProperties 14 | -dontwarn java.beans.Transient 15 | -dontwarn org.conscrypt.Conscrypt 16 | -dontwarn org.conscrypt.OpenSSLProvider 17 | -dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry -------------------------------------------------------------------------------- /dogfooding/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/java/io/flutter/app/FlutterMultiDexApplication.java: -------------------------------------------------------------------------------- 1 | // Generated file. 2 | // 3 | // If you wish to remove Flutter's multidex support, delete this entire file. 4 | // 5 | // Modifications to this file should be done in a copy under a different name 6 | // as this file may be regenerated. 7 | 8 | package io.flutter.app; 9 | 10 | import android.app.Application; 11 | import android.content.Context; 12 | import androidx.annotation.CallSuper; 13 | import androidx.multidex.MultiDex; 14 | 15 | /** 16 | * Extension of {@link android.app.Application}, adding multidex support. 17 | */ 18 | public class FlutterMultiDexApplication extends Application { 19 | @Override 20 | @CallSuper 21 | protected void attachBaseContext(Context base) { 22 | super.attachBaseContext(base); 23 | MultiDex.install(this); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/drawable-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/drawable-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-v24/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | 12 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/drawable-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/drawable-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/drawable-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-hdpi/ic_launcher.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-mdpi/ic_launcher.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp -------------------------------------------------------------------------------- /dogfooding/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dogfooding/android/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | package_name("io.getstream.video.flutter.dogfooding") # e.g. com.krausefx.app 2 | json_key_file("firebase-service-account.json") 3 | -------------------------------------------------------------------------------- /dogfooding/android/fastlane/Pluginfile: -------------------------------------------------------------------------------- 1 | # Autogenerated by fastlane 2 | # 3 | # Ensure this file is checked in to source control! 4 | 5 | gem 'fastlane-plugin-increment_version_code' 6 | -------------------------------------------------------------------------------- /dogfooding/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx4g -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -Dlint.nullness.ignore-deprecated=true 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.defaults.buildfeatures.buildconfig=true 5 | android.nonTransitiveRClass=false 6 | android.nonFinalResIds=false 7 | -------------------------------------------------------------------------------- /dogfooding/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip 6 | -------------------------------------------------------------------------------- /dogfooding/assets/bg1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/bg1.jpg -------------------------------------------------------------------------------- /dogfooding/assets/bg2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/bg2.jpg -------------------------------------------------------------------------------- /dogfooding/assets/bg3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/bg3.jpg -------------------------------------------------------------------------------- /dogfooding/assets/google_logo.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /dogfooding/assets/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/ic_launcher.png -------------------------------------------------------------------------------- /dogfooding/assets/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/ic_launcher_background.png -------------------------------------------------------------------------------- /dogfooding/assets/ic_launcher_background.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dogfooding/assets/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/ic_launcher_foreground.png -------------------------------------------------------------------------------- /dogfooding/assets/stream_video_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/stream_video_icon.png -------------------------------------------------------------------------------- /dogfooding/assets/video_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/assets/video_icon.png -------------------------------------------------------------------------------- /dogfooding/firebase.json: -------------------------------------------------------------------------------- 1 | {"flutter":{"platforms":{"android":{"default":{"projectId":"stream-video-9b586","appId":"1:347024607410:android:d51590d07b9f9f3c8c21ab","fileOutput":"android/app/google-services.json"}},"ios":{"default":{"projectId":"stream-video-9b586","appId":"1:347024607410:ios:ffe113a4b22025cd8c21ab","uploadDebugSymbols":true,"fileOutput":"ios/Runner/GoogleService-Info.plist"}},"macos":{"default":{"projectId":"stream-video-9b586","appId":"1:347024607410:ios:ffe113a4b22025cd8c21ab","uploadDebugSymbols":true,"fileOutput":"macos/Runner/GoogleService-Info.plist"}},"dart":{"lib/firebase_options.dart":{"projectId":"stream-video-9b586","configurations":{"android":"1:347024607410:android:d51590d07b9f9f3c8c21ab","ios":"1:347024607410:ios:ffe113a4b22025cd8c21ab","macos":"1:347024607410:ios:ffe113a4b22025cd8c21ab","web":"1:347024607410:web:fd70974cbc1256bb8c21ab","windows":"1:347024607410:web:a6bb53a4d4ce4a198c21ab"}}}}}} -------------------------------------------------------------------------------- /dogfooding/ios/.ruby-version: -------------------------------------------------------------------------------- 1 | 3.1.0 -------------------------------------------------------------------------------- /dogfooding/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 12.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /dogfooding/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/ios/Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem "fastlane" 4 | gem "cocoapods" 5 | gem 'fastlane-plugin-flutter_version', '~> 1.0', '>= 1.0.1' 6 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon1024.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon120.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon152.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon167.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon180.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon40.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon58.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon60.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon76.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon80.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-beta.appiconset/icon87.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-20@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-20@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-29@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-29@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-40@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-40@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-60@2x~car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-60@2x~car.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-60@3x~car.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon-60@3x~car.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon~ios-marketing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon-dev.appiconset/AppIcon~ios-marketing.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-Mask@1x.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "Icon-Mask@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "Icon-Mask@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@1x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@2x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/ios/Runner/Assets.xcassets/IconMask.imageset/Icon-Mask@3x.png -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /dogfooding/ios/Runner/Runner.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | aps-environment 6 | development 7 | com.apple.developer.associated-domains 8 | 9 | applinks:getstream.io 10 | applinks:pronto.getstream.io 11 | applinks:staging.getstream.io 12 | applinks:stream-calls-dogfood.vercel.app 13 | 14 | com.apple.security.application-groups 15 | 16 | group.io.getstream.video.flutter.dogfooding 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /dogfooding/ios/ScreenSharing/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | RTCAppGroupIdentifier 6 | group.io.getstream.video.flutter.dogfooding 7 | NSExtension 8 | 9 | NSExtensionPointIdentifier 10 | com.apple.broadcast-services-upload 11 | NSExtensionPrincipalClass 12 | $(PRODUCT_MODULE_NAME).SampleHandler 13 | RPBroadcastProcessMode 14 | RPBroadcastProcessModeSampleBuffer 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /dogfooding/ios/ScreenSharing/SampleHandler.swift: -------------------------------------------------------------------------------- 1 | import ReplayKit 2 | import stream_video_screen_sharing 3 | 4 | class SampleHandler: BroadcastSampleHandler {} 5 | -------------------------------------------------------------------------------- /dogfooding/ios/ScreenSharing/ScreenSharing.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.io.getstream.video.flutter.dogfooding 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dogfooding/ios/fastlane/Appfile: -------------------------------------------------------------------------------- 1 | app_identifier("io.getstream.video.flutter.dogfooding") # The bundle identifier of your app 2 | apple_id(ENV["FASTLANE_APPLE_ID"]) # Your Apple Developer Portal username 3 | 4 | itc_team_id("118902954") # App Store Connect Team ID 5 | team_id("EHV7XZLAHA") # Developer Portal Team ID 6 | 7 | # For more information about the Appfile, see: 8 | # https://docs.fastlane.tools/advanced/#appfile 9 | -------------------------------------------------------------------------------- /dogfooding/ios/fastlane/Matchfile: -------------------------------------------------------------------------------- 1 | git_url("git@github.com:GetStream/ios-certificates.git") 2 | 3 | storage_mode("git") 4 | 5 | team_id("EHV7XZLAHA") 6 | 7 | type("appstore") # The default type, can be: appstore, adhoc, enterprise or development 8 | 9 | app_identifier(["io.getstream.video.flutter.dogfooding", "io.getstream.video.flutter.dogfooding.ScreenSharing"]) 10 | # username("user@fastlane.tools") # Your Apple Developer Portal username 11 | -------------------------------------------------------------------------------- /dogfooding/ios/firebase_app_id_file.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_generated_by": "FlutterFire CLI", 3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", 4 | "GOOGLE_APP_ID": "1:347024607410:ios:ffe113a4b22025cd8c21ab", 5 | "FIREBASE_PROJECT_ID": "stream-video-9b586", 6 | "GCM_SENDER_ID": "347024607410" 7 | } -------------------------------------------------------------------------------- /dogfooding/lib/app/custom_video_localizations.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | import 'package:stream_video_flutter/stream_video_flutter_l10n.dart'; 3 | 4 | class CustomVideoLocalizationsNL extends StreamVideoFlutterLocalizationsNl { 5 | static LocalizationsDelegate get delegate => 6 | CustomVideoLocalizationsDelegate('nl', CustomVideoLocalizationsNL()); 7 | 8 | @override 9 | String get desktopScreenShareEntireScreen => 'Scherm'; 10 | } 11 | -------------------------------------------------------------------------------- /dogfooding/lib/dogfooding_app_channel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/services.dart'; 2 | 3 | class DogfoodingAppChannel { 4 | static const platform = 5 | MethodChannel('io.getstream.video.flutter.dogfooding.channel'); 6 | 7 | Future registerGreyscaleEffect() async { 8 | await platform.invokeMethod('registerGreyscaleEffect'); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /dogfooding/lib/main.dart: -------------------------------------------------------------------------------- 1 | // 🐦 Flutter imports: 2 | import 'package:flutter/widgets.dart'; 3 | 4 | // 🌎 Project imports: 5 | import 'app/app.dart'; 6 | 7 | void main() { 8 | // Needed to initialize the plugin bindings. 9 | WidgetsFlutterBinding.ensureInitialized(); 10 | 11 | runApp(const StreamDogFoodingApp()); 12 | } 13 | -------------------------------------------------------------------------------- /dogfooding/lib/theme/app_palette.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class AppColorPalette { 4 | AppColorPalette._(); 5 | 6 | static const Color backgroundColor = Color(0xFF101213); 7 | static const Color primary = Color(0xFF005FFF); 8 | static const Color buttonSecondary = Color(0xFF19232D); 9 | static const Color avatarBackground = Color(0xFF183158); 10 | static const Color appGreen = Color(0xFF00E2A1); 11 | static const Color primaryText = Color(0xFFEFF0F1); 12 | static const Color secondaryText = Color(0xFF979CA0); 13 | static const Color appRed = Color(0xFFDC433B); 14 | } 15 | -------------------------------------------------------------------------------- /dogfooding/lib/utils/after_layout.dart: -------------------------------------------------------------------------------- 1 | // 🎯 Dart imports: 2 | import 'dart:async'; 3 | 4 | // 🐦 Flutter imports: 5 | import 'package:flutter/widgets.dart'; 6 | 7 | mixin AfterLayoutMixin on State { 8 | @override 9 | void initState() { 10 | super.initState(); 11 | WidgetsBinding.instance.endOfFrame.then( 12 | (_) { 13 | if (mounted) afterFirstLayout(context); 14 | }, 15 | ); 16 | } 17 | 18 | FutureOr afterFirstLayout(BuildContext context); 19 | } 20 | -------------------------------------------------------------------------------- /dogfooding/lib/utils/assets.dart: -------------------------------------------------------------------------------- 1 | const streamLogoAsset = 'assets/stream_logo.svg'; 2 | const streamVideoIconAsset = 'assets/stream_video_icon.png'; 3 | const googleLogoAsset = 'assets/google_logo.svg'; 4 | const globalNetworkAssest = 'assets/global_network.svg'; 5 | -------------------------------------------------------------------------------- /dogfooding/lib/utils/consts.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter/services.dart' show appFlavor; 3 | import 'package:stream_video_flutter/stream_video_flutter.dart'; 4 | 5 | final StreamCallType kCallType = StreamCallType.defaultType(); 6 | const String kMessageChannelType = 'videocall'; 7 | const String kAppName = 'Stream Dogfooding'; 8 | const double kMaxWidthRegularScreen = 500; 9 | bool get kIsProd => switch (appFlavor) { 10 | 'dev' => false, 11 | 'beta' => false, 12 | 'prod' => true, 13 | _ => !kIsWeb, // On our web builds we enable non-prod features. 14 | }; 15 | -------------------------------------------------------------------------------- /dogfooding/lib/utils/loading_dialog.dart: -------------------------------------------------------------------------------- 1 | // 🐦 Flutter imports: 2 | import 'package:flutter/material.dart'; 3 | import 'package:go_router/go_router.dart'; 4 | 5 | // 📦 Package imports: 6 | import 'package:stream_video_flutter/stream_video_flutter.dart'; 7 | 8 | Future showLoadingIndicator(BuildContext context) async { 9 | return showDialog( 10 | context: context, 11 | barrierDismissible: false, 12 | builder: (BuildContext context) { 13 | return SimpleDialog( 14 | elevation: 0, 15 | backgroundColor: Colors.transparent, 16 | children: [ 17 | Center( 18 | child: CircularProgressIndicator( 19 | color: StreamVideoTheme.of(context).colorTheme.accentPrimary, 20 | ), 21 | ) 22 | ], 23 | ); 24 | }, 25 | ); 26 | } 27 | 28 | void hideLoadingIndicator(BuildContext context) => context.pop(); 29 | -------------------------------------------------------------------------------- /dogfooding/lib/widgets/settings_menu/settings_menu_item.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_dogfooding/theme/app_palette.dart'; 3 | 4 | class SettingsMenuItem extends StatelessWidget { 5 | const SettingsMenuItem({ 6 | super.key, 7 | required this.child, 8 | this.onPressed, 9 | }); 10 | 11 | final Widget child; 12 | final void Function()? onPressed; 13 | 14 | @override 15 | Widget build(BuildContext context) { 16 | return InkWell( 17 | onTap: onPressed, 18 | child: Container( 19 | constraints: const BoxConstraints(minHeight: 40), 20 | decoration: BoxDecoration( 21 | color: AppColorPalette.buttonSecondary, 22 | borderRadius: BorderRadius.circular(16), 23 | ), 24 | padding: const EdgeInsets.all(8), 25 | child: child, 26 | ), 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /dogfooding/linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /dogfooding/linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /dogfooding/linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /dogfooding/macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @main 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | 10 | override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { 11 | return true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-beta.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon-dev.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = dogfooding 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = io.getstream.video.flutter.dogfooding 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2022 io.getstream.video.flutter.dogfooding. All rights reserved. 15 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.network.server 16 | 17 | keychain-access-groups 18 | 19 | $(AppIdentifierPrefix)com.google.GIDSignIn 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /dogfooding/macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.network.server 16 | 17 | keychain-access-groups 18 | 19 | $(AppIdentifierPrefix)com.google.GIDSignIn 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /dogfooding/macos/firebase_app_id_file.json: -------------------------------------------------------------------------------- 1 | { 2 | "file_generated_by": "FlutterFire CLI", 3 | "purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory", 4 | "GOOGLE_APP_ID": "1:347024607410:ios:ffe113a4b22025cd8c21ab", 5 | "FIREBASE_PROJECT_ID": "stream-video-9b586", 6 | "GCM_SENDER_ID": "347024607410" 7 | } -------------------------------------------------------------------------------- /dogfooding/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/web/favicon.png -------------------------------------------------------------------------------- /dogfooding/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/web/icons/Icon-192.png -------------------------------------------------------------------------------- /dogfooding/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/web/icons/Icon-512.png -------------------------------------------------------------------------------- /dogfooding/web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /dogfooding/web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /dogfooding/windows/runner/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Runner.rc 4 | // 5 | #define IDI_APP_ICON 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /dogfooding/windows/runner/resources/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/dogfooding/windows/runner/resources/app_icon.ico -------------------------------------------------------------------------------- /dogfooding/windows/runner/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_UTILS_H_ 2 | #define RUNNER_UTILS_H_ 3 | 4 | #include 5 | #include 6 | 7 | // Creates a console for the process, and redirects stdout and stderr to 8 | // it for both the runner and the Flutter library. 9 | void CreateAndAttachConsole(); 10 | 11 | // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string 12 | // encoded in UTF-8. Returns an empty std::string on failure. 13 | std::string Utf8FromUtf16(const wchar_t* utf16_string); 14 | 15 | // Gets the command line arguments passed in as a std::vector, 16 | // encoded in UTF-8. Returns an empty std::vector on failure. 17 | std::vector GetCommandLineArguments(); 18 | 19 | #endif // RUNNER_UTILS_H_ 20 | -------------------------------------------------------------------------------- /packages/stream_video/example/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:stream_video/stream_video.dart'; 3 | 4 | Future main() async { 5 | WidgetsFlutterBinding.ensureInitialized(); 6 | 7 | StreamVideo.create( 8 | 'api_token', 9 | user: User.guest(userId: 'user_id'), 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/globals.dart: -------------------------------------------------------------------------------- 1 | import 'package:meta/meta.dart'; 2 | 3 | const String streamSdkName = 'stream-flutter'; 4 | const String streamVideoVersion = '0.9.5'; 5 | const String openapiModelsVersion = '167.9.1'; 6 | const String protocolModelsVersion = '1.35.0'; 7 | const String androidWebRTCVersion = '1.3.8'; 8 | const String iosWebRTCVersion = '125.6422.65'; 9 | 10 | const String streamDefaultUserAgent = 11 | 'stream-video-flutter-v$streamVideoVersion'; 12 | final xStreamClientHeader = '$streamDefaultUserAgent|$clientVersionDetails'; 13 | 14 | /// Details regarding app name, version, os and device. Is set during initialization of StreamVideo instance. 15 | @internal 16 | String? clientVersionDetails; 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/open_api/video/coordinator/auth/authentication.dart: -------------------------------------------------------------------------------- 1 | // 2 | // AUTO-GENERATED FILE, DO NOT MODIFY! 3 | // 4 | // @dart=2.18 5 | 6 | // ignore_for_file: unused_element, unused_import 7 | // ignore_for_file: always_put_required_named_parameters_first 8 | // ignore_for_file: constant_identifier_names 9 | // ignore_for_file: lines_longer_than_80_chars 10 | 11 | part of openapi.api; 12 | 13 | // ignore: one_member_abstracts 14 | abstract class Authentication { 15 | /// Apply authentication settings to header and query params. 16 | Future applyToParams( 17 | List queryParams, Map headerParams); 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video/lib/open_api/video/coordinator/auth/oauth.dart: -------------------------------------------------------------------------------- 1 | // 2 | // AUTO-GENERATED FILE, DO NOT MODIFY! 3 | // 4 | // @dart=2.18 5 | 6 | // ignore_for_file: unused_element, unused_import 7 | // ignore_for_file: always_put_required_named_parameters_first 8 | // ignore_for_file: constant_identifier_names 9 | // ignore_for_file: lines_longer_than_80_chars 10 | 11 | part of openapi.api; 12 | 13 | class OAuth implements Authentication { 14 | OAuth({this.accessToken = ''}); 15 | 16 | String accessToken; 17 | 18 | @override 19 | Future applyToParams( 20 | List queryParams, 21 | Map headerParams, 22 | ) async { 23 | if (accessToken.isNotEmpty) { 24 | headerParams['Authorization'] = 'Bearer $accessToken'; 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/duration.pbenum.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/duration.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/duration.pbserver.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/duration.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | 8 | export 'duration.pb.dart'; 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/struct.pbserver.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/struct.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | 8 | export 'struct.pb.dart'; 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/timestamp.pbenum.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/timestamp.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/timestamp.pbserver.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/timestamp.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | 8 | export 'timestamp.pb.dart'; 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/wrappers.pbenum.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/wrappers.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/google/protobuf/wrappers.pbserver.dart: -------------------------------------------------------------------------------- 1 | /// 2 | // Generated code. Do not modify. 3 | // source: google/protobuf/wrappers.proto 4 | // 5 | // @dart = 2.12 6 | // ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name 7 | 8 | export 'wrappers.pb.dart'; 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/video/sfu/event/events.pbenum.dart: -------------------------------------------------------------------------------- 1 | // 2 | // Generated code. Do not modify. 3 | // source: video/sfu/event/events.proto 4 | // 5 | // @dart = 3.3 6 | 7 | // ignore_for_file: annotate_overrides, camel_case_types, comment_references 8 | // ignore_for_file: constant_identifier_names, library_prefixes 9 | // ignore_for_file: non_constant_identifier_names, prefer_final_fields 10 | // ignore_for_file: unnecessary_import, unnecessary_this, unused_import 11 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/video/sfu/event/events.pbserver.dart: -------------------------------------------------------------------------------- 1 | // 2 | // Generated code. Do not modify. 3 | // source: video/sfu/event/events.proto 4 | // 5 | // @dart = 3.3 6 | 7 | // ignore_for_file: annotate_overrides, camel_case_types, comment_references 8 | // ignore_for_file: constant_identifier_names 9 | // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes 10 | // ignore_for_file: non_constant_identifier_names, prefer_final_fields 11 | // ignore_for_file: unnecessary_import, unnecessary_this, unused_import 12 | 13 | export 'events.pb.dart'; 14 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/video/sfu/models/models.pbserver.dart: -------------------------------------------------------------------------------- 1 | // 2 | // Generated code. Do not modify. 3 | // source: video/sfu/models/models.proto 4 | // 5 | // @dart = 3.3 6 | 7 | // ignore_for_file: annotate_overrides, camel_case_types, comment_references 8 | // ignore_for_file: constant_identifier_names 9 | // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes 10 | // ignore_for_file: non_constant_identifier_names, prefer_final_fields 11 | // ignore_for_file: unnecessary_import, unnecessary_this, unused_import 12 | 13 | export 'models.pb.dart'; 14 | -------------------------------------------------------------------------------- /packages/stream_video/lib/protobuf/video/sfu/signal_rpc/signal.pbenum.dart: -------------------------------------------------------------------------------- 1 | // 2 | // Generated code. Do not modify. 3 | // source: video/sfu/signal_rpc/signal.proto 4 | // 5 | // @dart = 3.3 6 | 7 | // ignore_for_file: annotate_overrides, camel_case_types, comment_references 8 | // ignore_for_file: constant_identifier_names, library_prefixes 9 | // ignore_for_file: non_constant_identifier_names, prefer_final_fields 10 | // ignore_for_file: unnecessary_import, unnecessary_this, unused_import 11 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/audio_processing/audio_processor.dart: -------------------------------------------------------------------------------- 1 | import '../utils/none.dart'; 2 | import '../utils/result.dart'; 3 | 4 | abstract class AudioProcessor { 5 | Future> isEnabled(); 6 | Future> setEnabled(bool enabled); 7 | Future> deviceSupportsAdvancedAudioProcessing(); 8 | } 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/call/call_ringing_state.dart: -------------------------------------------------------------------------------- 1 | enum CallRingingState { 2 | ended, 3 | rejected, 4 | accepted, 5 | ringing, 6 | } 7 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/call/session/call_session_config.dart: -------------------------------------------------------------------------------- 1 | import '../../types/other.dart'; 2 | 3 | class CallSessionConfig { 4 | const CallSessionConfig({ 5 | required this.sfuName, 6 | required this.sfuToken, 7 | required this.sfuUrl, 8 | required this.sfuWsEndpoint, 9 | required this.rtcConfig, 10 | }); 11 | 12 | final String sfuName; 13 | final String sfuToken; 14 | final String sfuUrl; 15 | final String sfuWsEndpoint; 16 | final RTCConfiguration rtcConfig; 17 | 18 | @override 19 | String toString() { 20 | return 'CallSessionConfig{sfuName: $sfuName, sfuToken: $sfuToken, ' 21 | 'sfuUrl: $sfuUrl, sfuWsEndpoint: $sfuWsEndpoint, ' 22 | 'rtcConfig: $rtcConfig}'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/coordinator/open_api/error/open_api_error_code.dart: -------------------------------------------------------------------------------- 1 | mixin OpenApiErrorCode { 2 | static const tokenExpired = 40; 3 | static const tokenNotValid = 41; 4 | static const tokenDateIncorrect = 42; 5 | static const tokenSignatureIncorrect = 43; 6 | static const apiKeyNotFound = 2; 7 | 8 | static final tokenRelated = [ 9 | tokenExpired, 10 | tokenNotValid, 11 | tokenDateIncorrect, 12 | tokenSignatureIncorrect, 13 | ]; 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/core/utils.dart: -------------------------------------------------------------------------------- 1 | import '../types/other.dart'; 2 | 3 | RTCConfiguration defaultRtcConfiguration(String sfuUrl) { 4 | final hostName = Uri.parse(sfuUrl).host; 5 | 6 | return RTCConfiguration( 7 | iceServers: [ 8 | const RTCIceServer( 9 | urls: ['stun:stun.l.google.com:19302'], 10 | ), 11 | RTCIceServer( 12 | urls: ['turn:$hostName:3478'], 13 | username: 'video', 14 | credential: 'video', 15 | ), 16 | ], 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/core/video_error.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:web_socket_channel/web_socket_channel.dart'; 3 | 4 | class StreamVideoError with EquatableMixin implements Exception { 5 | const StreamVideoError(this.message); 6 | 7 | /// Error message 8 | final String message; 9 | 10 | @override 11 | List get props => [message]; 12 | 13 | @override 14 | String toString() => 'StreamVideoError(message: $message)'; 15 | } 16 | 17 | class StreamVideoWebSocketError extends StreamVideoError { 18 | const StreamVideoWebSocketError(super.message); 19 | 20 | factory StreamVideoWebSocketError.fromWebSocketChannelError( 21 | WebSocketChannelException error, 22 | ) { 23 | final message = error.message ?? ''; 24 | return StreamVideoWebSocketError(message); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/disposable.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:meta/meta.dart'; 4 | 5 | /// A convenience class to represent a disposable object. 6 | class Disposable { 7 | /// Returns `true` if this object has been disposed. 8 | bool get isDisposed => _disposed; 9 | bool _disposed = false; 10 | 11 | /// Disposes of this object. 12 | @mustCallSuper 13 | FutureOr dispose() async { 14 | if (_disposed) return; 15 | _disposed = true; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/events.dart: -------------------------------------------------------------------------------- 1 | import 'types/other.dart'; 2 | 3 | /// Model class for connection state updates. 4 | class ConnectionStateUpdatedEvent { 5 | /// Creates a new instance of [ConnectionStateUpdatedEvent]. 6 | const ConnectionStateUpdatedEvent({ 7 | required this.newState, 8 | required this.oldState, 9 | required this.didConnected, 10 | }); 11 | 12 | /// The new connection state. 13 | final ConnectionState newState; 14 | 15 | /// The old connection state. 16 | final ConnectionState oldState; 17 | 18 | /// Whether the connection state changed to [ConnectionState.connected]. 19 | final bool didConnected; 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/exceptions/video_exception.dart: -------------------------------------------------------------------------------- 1 | class VideoException implements Exception { 2 | factory VideoException(String message) { 3 | return VideoException._(message); 4 | } 5 | 6 | const VideoException._(this.message); 7 | 8 | final String message; 9 | 10 | @override 11 | String toString() { 12 | return 'VideoException{message: $message}'; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/latency/latency_settings.dart: -------------------------------------------------------------------------------- 1 | /// Latency measurement settings. 2 | class LatencySettings { 3 | const LatencySettings({ 4 | this.measurementRounds = 3, 5 | this.measurementTimeout = const Duration(seconds: 3), 6 | }); 7 | 8 | /// Measurement attempt count per each SFU edge. 9 | final int measurementRounds; 10 | 11 | /// Measurement process timeout. 12 | final Duration measurementTimeout; 13 | } 14 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/lifecycle/lifecycle_state.dart: -------------------------------------------------------------------------------- 1 | enum LifecycleState { 2 | paused, 3 | resumed, 4 | inactive, 5 | detached, 6 | hidden; 7 | 8 | @override 9 | String toString() => name; 10 | 11 | bool get isResumed => this == LifecycleState.resumed; 12 | 13 | bool get isPaused => this == LifecycleState.paused; 14 | 15 | bool get isDetached => this == LifecycleState.detached; 16 | 17 | bool get isInactive => this == LifecycleState.inactive; 18 | 19 | bool get isHidden => this == LifecycleState.hidden; 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/lifecycle/lifecycle_utils.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import '../logger/impl/tagged_logger.dart'; 4 | import 'lifecycle_state.dart'; 5 | 6 | final _logger = taggedLogger(tag: 'SV:LifecycleUtils'); 7 | 8 | @override 9 | Stream get appState { 10 | _logger.w(() => '[appState] stub implementation'); 11 | return const Stream.empty(); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/location/location_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:http/http.dart' as http; 2 | 3 | import '../logger/stream_log.dart'; 4 | 5 | const _tag = 'SV:LocationService'; 6 | 7 | class LocationService { 8 | Future getLocation() async { 9 | try { 10 | streamLog.d(_tag, () => '[getLocation] no args'); 11 | final uri = Uri( 12 | scheme: 'https', 13 | host: 'hint.stream-io-video.com', 14 | ); 15 | final response = await http.head(uri); 16 | streamLog.v(_tag, () => '[getLocation] response: $response'); 17 | streamLog.v(_tag, () => '[getLocation] headers: ${response.headers}'); 18 | final location = response.headers['x-amz-cf-pop'] ?? 'ERR'; 19 | return location.substring(0, 3); // AMS1-P2 -> AMS 20 | } catch (e, stk) { 21 | streamLog.e(_tag, () => '[getLocation] failed: $e; $stk'); 22 | return 'ERR'; 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/logger/impl/console_logger.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | 3 | import '../stream_logger.dart'; 4 | 5 | class ConsoleStreamLogger extends StreamLogger { 6 | const ConsoleStreamLogger(); 7 | 8 | @override 9 | void log( 10 | Priority priority, 11 | String tag, 12 | MessageBuilder message, [ 13 | Object? error, 14 | StackTrace? stk, 15 | ]) { 16 | final emoji = super.emoji(priority); 17 | final name = super.name(priority); 18 | debugPrint('${DateTime.now()} $emoji ($name/$tag): ${message()}'); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/logger/impl/external_logger.dart: -------------------------------------------------------------------------------- 1 | import '../stream_logger.dart'; 2 | 3 | typedef ExternalFunction = void Function( 4 | Priority priority, 5 | String tag, 6 | MessageBuilder message, [ 7 | Object? error, 8 | StackTrace? stk, 9 | ]); 10 | 11 | class ExternalStreamLogger extends StreamLogger { 12 | const ExternalStreamLogger(this.external); 13 | 14 | final ExternalFunction external; 15 | 16 | @override 17 | void log( 18 | Priority priority, 19 | String tag, 20 | MessageBuilder message, [ 21 | Object? error, 22 | StackTrace? stk, 23 | ]) { 24 | return external.call(priority, tag, message, error, stk); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/logger/impl/tagged_logger.dart: -------------------------------------------------------------------------------- 1 | import '../stream_log.dart'; 2 | import '../stream_logger.dart'; 3 | 4 | TaggedLogger taggedLogger({required Tag tag}) { 5 | return TaggedLogger(tag); 6 | } 7 | 8 | class TaggedLogger { 9 | const TaggedLogger(this.tag); 10 | 11 | final Tag tag; 12 | 13 | void v(MessageBuilder message) { 14 | streamLog.v(tag, message); 15 | } 16 | 17 | void d(MessageBuilder message) { 18 | streamLog.d(tag, message); 19 | } 20 | 21 | void i(MessageBuilder message) { 22 | streamLog.i(tag, message); 23 | } 24 | 25 | void w(MessageBuilder message) { 26 | streamLog.w(tag, message); 27 | } 28 | 29 | void e(MessageBuilder message) { 30 | streamLog.e(tag, message); 31 | } 32 | 33 | void log(Priority priority, MessageBuilder message) { 34 | streamLog.log(priority, tag, message); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/call_created_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:meta/meta.dart'; 3 | 4 | import 'call_cid.dart'; 5 | import 'call_metadata.dart'; 6 | 7 | @immutable 8 | class CallCreatedData with EquatableMixin { 9 | const CallCreatedData({ 10 | required this.callCid, 11 | required this.metadata, 12 | }); 13 | 14 | final StreamCallCid callCid; 15 | final CallMetadata metadata; 16 | 17 | @override 18 | List get props => [callCid, metadata]; 19 | 20 | @override 21 | String toString() { 22 | return 'CallCreated{callCid: $callCid, metadata: $metadata}'; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/call_participant_pin.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class CallParticipantPin with EquatableMixin { 4 | const CallParticipantPin({ 5 | required this.isLocalPin, 6 | required this.pinnedAt, 7 | }); 8 | 9 | final bool isLocalPin; 10 | final DateTime pinnedAt; 11 | 12 | @override 13 | List get props => [isLocalPin, pinnedAt]; 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/call_received_created_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:meta/meta.dart'; 3 | 4 | import 'call_created_data.dart'; 5 | 6 | @immutable 7 | class CallReceivedOrCreatedData with EquatableMixin { 8 | const CallReceivedOrCreatedData({ 9 | required this.wasCreated, 10 | required this.data, 11 | }); 12 | 13 | final bool wasCreated; 14 | final CallCreatedData data; 15 | 16 | @override 17 | List get props => [wasCreated, data]; 18 | 19 | @override 20 | String toString() { 21 | return 'CallReceivedOrCreated{wasCreated: $wasCreated, data: $data}'; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/call_received_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:meta/meta.dart'; 3 | 4 | import 'models.dart'; 5 | 6 | @immutable 7 | class CallReceivedData with EquatableMixin { 8 | const CallReceivedData({ 9 | required this.callCid, 10 | required this.metadata, 11 | }); 12 | 13 | final StreamCallCid callCid; 14 | final CallMetadata metadata; 15 | 16 | @override 17 | List get props => [callCid, metadata]; 18 | 19 | @override 20 | String toString() { 21 | return 'CallReceivedData{callCid: $callCid, metadata: $metadata}'; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/call_ringing_data.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'package:meta/meta.dart'; 3 | 4 | import 'call_cid.dart'; 5 | import 'call_metadata.dart'; 6 | 7 | @immutable 8 | class CallRingingData with EquatableMixin { 9 | const CallRingingData({ 10 | required this.callCid, 11 | required this.ringing, 12 | required this.metadata, 13 | }); 14 | 15 | final StreamCallCid callCid; 16 | final bool ringing; 17 | final CallMetadata metadata; 18 | 19 | @override 20 | List get props => [callCid, ringing, metadata]; 21 | 22 | @override 23 | String toString() { 24 | return 'CallRingingData{callCid: $callCid, ringing: $ringing, ' 25 | 'metadata: $metadata}'; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/push_provider.dart: -------------------------------------------------------------------------------- 1 | import 'package:collection/collection.dart'; 2 | 3 | /// Provider used to send push notifications. 4 | enum PushProvider { 5 | /// Send notifications using Google's Firebase Cloud Messaging 6 | firebase('firebase'), 7 | 8 | /// Send notifications using Huawei's Push Kit 9 | huawei('huawei'), 10 | 11 | /// Send notifications using Xiaomi's Mi Push Service 12 | xiaomi('xiaomi'), 13 | 14 | /// Send notifications using Apple's Push Notification service 15 | apn('apn'); 16 | 17 | const PushProvider(this.alias); 18 | 19 | final String alias; 20 | 21 | @override 22 | String toString() => alias; 23 | 24 | static PushProvider? fromAlias(String? alias) { 25 | return PushProvider.values.firstWhereOrNull( 26 | (it) => it.alias == alias, 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/viewport_visibility.dart: -------------------------------------------------------------------------------- 1 | /// The visibility of a widget in the viewport. 2 | enum ViewportVisibility { 3 | /// Unknown, not yet determined. 4 | unknown, 5 | 6 | /// Visible in the viewport. 7 | visible, 8 | 9 | /// Hidden from the viewport. 10 | hidden; 11 | 12 | /// Returns the [ViewportVisibility] for the given [visibleFraction]. 13 | static ViewportVisibility fromVisibleFraction(double visibleFraction) { 14 | // We mark the visibility as visible if the visible fraction is greater 15 | // than 0.3 i;e. 30% of the widget is visible. 16 | if (visibleFraction > 0.3) return ViewportVisibility.visible; 17 | return ViewportVisibility.hidden; 18 | } 19 | 20 | bool get isUnknown => this == ViewportVisibility.unknown; 21 | 22 | bool get isVisible => this == ViewportVisibility.visible; 23 | 24 | bool get isHidden => this == ViewportVisibility.hidden; 25 | } 26 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/models/visibility_change.dart: -------------------------------------------------------------------------------- 1 | import 'viewport_visibility.dart'; 2 | 3 | class VisibilityChange { 4 | const VisibilityChange({ 5 | required this.sessionId, 6 | required this.userId, 7 | required this.visibility, 8 | }); 9 | 10 | final String sessionId; 11 | final String userId; 12 | final ViewportVisibility visibility; 13 | 14 | List get props => [sessionId, userId, visibility]; 15 | 16 | @override 17 | String toString() { 18 | return 'SubscriptionChange{sessionId: $sessionId, userId: $userId, ' 19 | 'visibility: $visibility'; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/platform_detector/platform_detector_io.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'platform_detector.dart'; 4 | 5 | /// Version running on native systems 6 | PlatformType get currentPlatform { 7 | if (Platform.isWindows) return PlatformType.windows; 8 | if (Platform.isFuchsia) return PlatformType.fuchsia; 9 | if (Platform.isMacOS) return PlatformType.macOS; 10 | if (Platform.isLinux) return PlatformType.linux; 11 | if (Platform.isIOS) return PlatformType.ios; 12 | return PlatformType.android; 13 | } 14 | 15 | /// True if the app is running in test environment. 16 | bool get isFlutterTestEnvironment { 17 | return Platform.environment.containsKey('FLUTTER_TEST'); 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/platform_detector/platform_detector_stub.dart: -------------------------------------------------------------------------------- 1 | import 'platform_detector.dart'; 2 | 3 | /// Stub implementation 4 | PlatformType get currentPlatform => throw UnimplementedError(); 5 | 6 | /// Stub implementation 7 | bool get isFlutterTestEnvironment => throw UnimplementedError(); 8 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/platform_detector/platform_detector_web.dart: -------------------------------------------------------------------------------- 1 | import 'platform_detector.dart'; 2 | 3 | /// Version running on web 4 | PlatformType get currentPlatform => PlatformType.web; 5 | 6 | /// True if the app is running in test environment. 7 | /// 8 | /// Always returns false as we don't have environment variables on web. 9 | bool get isFlutterTestEnvironment => false; 10 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_call_ended_reason.dart: -------------------------------------------------------------------------------- 1 | enum SfuCallEndedReason { 2 | unspecified, 3 | ended, 4 | liveEnded, 5 | kicked, 6 | sessionEnded; 7 | 8 | @override 9 | String toString() { 10 | return name; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_call_grants.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class SfuCallGrants with EquatableMixin { 4 | SfuCallGrants({ 5 | required this.canPublishAudio, 6 | required this.canPublishVideo, 7 | required this.canScreenShare, 8 | }); 9 | 10 | final bool canPublishAudio; 11 | final bool canPublishVideo; 12 | final bool canScreenShare; 13 | 14 | @override 15 | bool? get stringify => true; 16 | 17 | @override 18 | List get props => [canPublishAudio, canPublishVideo, canScreenShare]; 19 | } 20 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_connection_quality.dart: -------------------------------------------------------------------------------- 1 | enum SfuConnectionQuality { 2 | unspecified, 3 | poor, 4 | good, 5 | excellent; 6 | 7 | @override 8 | String toString() { 9 | return name; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_goaway_reason.dart: -------------------------------------------------------------------------------- 1 | enum SfuGoAwayReason { 2 | rebalance, 3 | shuttingDown, 4 | migrate, 5 | unspecified; 6 | 7 | @override 8 | String toString() { 9 | return name; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_pin.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class SfuPin with EquatableMixin { 4 | SfuPin({ 5 | required this.userId, 6 | required this.sessionId, 7 | }); 8 | 9 | final String userId; 10 | final String sessionId; 11 | 12 | @override 13 | List get props => [userId, sessionId]; 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/sfu/data/models/sfu_video_sender.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | import 'sfu_codec.dart'; 3 | 4 | import 'sfu_track_type.dart'; 5 | import 'sfu_video_layer_setting.dart'; 6 | 7 | class SfuVideoSender with EquatableMixin { 8 | SfuVideoSender({ 9 | required this.codec, 10 | required this.layers, 11 | required this.trackType, 12 | required this.publishOptionId, 13 | }); 14 | 15 | final SfuCodec codec; 16 | final List layers; 17 | final SfuTrackType trackType; 18 | final int publishOptionId; 19 | 20 | @override 21 | bool? get stringify => true; 22 | 23 | @override 24 | List get props => [codec, layers, trackType, publishOptionId]; 25 | } 26 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/cancelable_operation.dart: -------------------------------------------------------------------------------- 1 | import 'package:async/async.dart' as async; 2 | 3 | import 'cancelables.dart'; 4 | 5 | extension CancelableOperationX on async.CancelableOperation { 6 | Future valueOrDefault(T cancellationValue) { 7 | return valueOrCancellation(cancellationValue).then((value) => value!); 8 | } 9 | 10 | async.CancelableOperation storeIn(int id, Cancelables cancelables) { 11 | cancelables.add(id, this); 12 | return this; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/cancelables.dart: -------------------------------------------------------------------------------- 1 | import 'package:async/async.dart'; 2 | 3 | class Cancelables { 4 | final _cancelables = >{}; 5 | 6 | void add(int id, CancelableOperation cancelable) { 7 | _cancelables[id]?.cancel(); 8 | _cancelables[id] = cancelable; 9 | } 10 | 11 | void cancel(int id) { 12 | _cancelables[id]?.cancel(); 13 | _cancelables.remove(id); 14 | } 15 | 16 | void cancelAll() { 17 | for (final cancelable in _cancelables.values) { 18 | cancelable.cancel(); 19 | } 20 | _cancelables.clear(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/completer.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | extension CompleterX on Completer { 4 | void completeSafely([FutureOr? value]) { 5 | if (!isCompleted) { 6 | complete(value); 7 | } 8 | } 9 | 10 | void completeErrorSafely(Object error, [StackTrace? stackTrace]) { 11 | if (!isCompleted) { 12 | completeError(error, stackTrace); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/extensions.dart: -------------------------------------------------------------------------------- 1 | /// Extensions on [String]. 2 | extension StringExtension on String { 3 | bool equalsIgnoreCase(String other) => toUpperCase() == other.toUpperCase(); 4 | String capitalizeFirstLetter() => '${this[0].toUpperCase()}${substring(1)}'; 5 | } 6 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/format.dart: -------------------------------------------------------------------------------- 1 | const _sizes = ['B', 'Kb', 'Mb', 'Gb']; 2 | 3 | String bytesCountToReadableString(int bytesCount) { 4 | if (bytesCount < 1024) { 5 | return '$bytesCount B'; 6 | } 7 | var doubleBytes = bytesCount.toDouble(); 8 | var sizeIndex = 0; 9 | while (doubleBytes >= 1024 && sizeIndex < _sizes.length - 1) { 10 | doubleBytes /= 1024; 11 | sizeIndex++; 12 | } 13 | return '${doubleBytes.toStringAsFixed(2)} ${_sizes[sizeIndex]}'; 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/future.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:async/async.dart' as async; 4 | 5 | import 'stream.dart'; 6 | 7 | extension FutureX on Future { 8 | async.CancelableOperation asCancelable() { 9 | return async.CancelableOperation.fromFuture(this); 10 | } 11 | 12 | StreamSubscription listenFirst( 13 | void Function(T event)? onData, { 14 | Function? onError, 15 | void Function()? onDone, 16 | bool? cancelOnError, 17 | }) { 18 | return asStream().listenFirst( 19 | onData, 20 | onError: onError, 21 | onDone: onDone, 22 | cancelOnError: cancelOnError, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/iterable.dart: -------------------------------------------------------------------------------- 1 | extension IterableUtils> on T { 2 | R? ifNotEmpty(R Function(T it) convert) { 3 | if (isNotEmpty) { 4 | return convert(this); 5 | } 6 | return null; 7 | } 8 | } 9 | 10 | extension NullableIterableUtils> on T? { 11 | R? ifNotEmptyOrNull(R Function(T it) convert) { 12 | final self = this; 13 | if (self != null && self.isNotEmpty) { 14 | return convert(self); 15 | } 16 | return null; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/list.dart: -------------------------------------------------------------------------------- 1 | extension ListUtils on List { 2 | List movedToFront(T item) { 3 | final itemIndex = indexOf(item); 4 | if (itemIndex != -1 && itemIndex != 0) { 5 | final result = [...this]; 6 | return result 7 | ..insert( 8 | 0, 9 | result.removeAt(itemIndex), 10 | ); 11 | } 12 | return this; 13 | } 14 | 15 | T? getOrNull(int index) { 16 | if (index >= 0 && index < length) { 17 | return this[index]; 18 | } 19 | return null; 20 | } 21 | 22 | T nextOr(int index, T Function() or) { 23 | final nextIndex = index + 1; 24 | if (nextIndex >= 0 && nextIndex < length) { 25 | return this[nextIndex]; 26 | } 27 | return or(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/none.dart: -------------------------------------------------------------------------------- 1 | /// Used instead of `void` as a return statement for a function when no value 2 | /// is expected to be returned. 3 | /// 4 | /// There is only one value of type [None]. 5 | class None { 6 | const None._instance(); 7 | 8 | static const None _none = None._instance(); 9 | 10 | @override 11 | String toString() => 'None'; 12 | } 13 | 14 | /// Used instead of `void` as a return statement for a function when no value 15 | /// is expected to be returned. 16 | const none = None._none; 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/pair.dart: -------------------------------------------------------------------------------- 1 | import 'package:meta/meta.dart'; 2 | 3 | @immutable 4 | class Pair { 5 | const Pair({ 6 | required this.first, 7 | required this.second, 8 | }); 9 | 10 | final T1 first; 11 | final T2 second; 12 | 13 | @override 14 | bool operator ==(Object other) => 15 | identical(this, other) || 16 | other is Pair && 17 | runtimeType == other.runtimeType && 18 | first == other.first && 19 | second == other.second; 20 | 21 | @override 22 | int get hashCode => first.hashCode ^ second.hashCode; 23 | 24 | @override 25 | String toString() { 26 | return 'Pair{first: $first, second: $second}'; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/standard.dart: -------------------------------------------------------------------------------- 1 | extension Standard on T { 2 | R let(R Function(T it) convert) { 3 | return convert(this); 4 | } 5 | 6 | T also(void Function(T it) block) { 7 | block(this); 8 | return this; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/stream.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | const _one = 1; 4 | 5 | extension StreamX on Stream { 6 | StreamSubscription listenFirst( 7 | void Function(T event)? onData, { 8 | Function? onError, 9 | void Function()? onDone, 10 | bool? cancelOnError, 11 | }) { 12 | return take(_one).listen( 13 | onData, 14 | onError: onError, 15 | onDone: onDone, 16 | cancelOnError: cancelOnError, 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/string.dart: -------------------------------------------------------------------------------- 1 | import 'dart:math'; 2 | 3 | const _chars = 'abcdefghijklmnopqrstuvwxyz1234567890'; 4 | Random _rnd = Random(); 5 | 6 | String generateAlphanumericString(int length) => String.fromCharCodes( 7 | Iterable.generate( 8 | length, 9 | (_) => _chars.codeUnitAt(_rnd.nextInt(_chars.length)), 10 | ), 11 | ); 12 | 13 | extension StringX on String { 14 | String ifEmpty(String Function() block) { 15 | if (isEmpty) { 16 | return block(); 17 | } 18 | return this; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/subscriptions.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | class Subscriptions { 4 | final _subscriptions = >{}; 5 | 6 | void add(int id, StreamSubscription subscription) { 7 | _subscriptions[id]?.cancel(); 8 | _subscriptions[id] = subscription; 9 | } 10 | 11 | bool contains(int id) { 12 | return _subscriptions.containsKey(id); 13 | } 14 | 15 | void addIfAbsent(int id, StreamSubscription Function() ifAbsent) { 16 | if (_subscriptions.containsKey(id)) return; 17 | 18 | _subscriptions[id] = ifAbsent(); 19 | } 20 | 21 | void cancel(int id) { 22 | _subscriptions[id]?.cancel(); 23 | _subscriptions.remove(id); 24 | } 25 | 26 | void cancelAll() { 27 | for (final subscription in _subscriptions.values) { 28 | subscription.cancel(); 29 | } 30 | _subscriptions.clear(); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/utils/triple.dart: -------------------------------------------------------------------------------- 1 | import 'package:meta/meta.dart'; 2 | 3 | @immutable 4 | class Triple { 5 | const Triple({ 6 | required this.first, 7 | required this.second, 8 | required this.third, 9 | }); 10 | 11 | final T1 first; 12 | final T2 second; 13 | final T3 third; 14 | 15 | @override 16 | bool operator ==(Object other) => 17 | identical(this, other) || 18 | other is Triple && 19 | runtimeType == other.runtimeType && 20 | first == other.first && 21 | second == other.second && 22 | third == other.third; 23 | 24 | @override 25 | int get hashCode => first.hashCode ^ second.hashCode ^ third.hashCode; 26 | 27 | @override 28 | String toString() { 29 | return 'Triple{first: $first, second: $second, third: $third}'; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/media/constraints/camera_position.dart: -------------------------------------------------------------------------------- 1 | import 'facing_mode.dart'; 2 | 3 | /// Enum type to represent the camera position of a video track. 4 | enum CameraPosition { 5 | front, 6 | back; 7 | 8 | /// Returns a flipped camera position. 9 | CameraPosition flip() { 10 | switch (this) { 11 | case CameraPosition.front: 12 | return CameraPosition.back; 13 | case CameraPosition.back: 14 | return CameraPosition.front; 15 | } 16 | } 17 | 18 | /// Converts this enum to a [FacingMode]. 19 | FacingMode toFacingMode() { 20 | switch (this) { 21 | case CameraPosition.front: 22 | return FacingMode.user; 23 | case CameraPosition.back: 24 | return FacingMode.environment; 25 | } 26 | } 27 | 28 | @override 29 | String toString() => name; 30 | } 31 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/media/constraints/facing_mode.dart: -------------------------------------------------------------------------------- 1 | /// https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode 2 | enum FacingMode { 3 | user('user'), 4 | environment('environment'), 5 | left('left'), 6 | right('right'); 7 | 8 | const FacingMode(this.alias); 9 | 10 | factory FacingMode.fromAlias(String? alias) { 11 | return FacingMode.values.firstWhere( 12 | (it) => it.alias == alias, 13 | orElse: () => FacingMode.user, 14 | ); 15 | } 16 | 17 | final String alias; 18 | 19 | FacingMode flip() { 20 | switch (this) { 21 | case FacingMode.user: 22 | return FacingMode.environment; 23 | case FacingMode.environment: 24 | return FacingMode.user; 25 | case FacingMode.left: 26 | return FacingMode.right; 27 | case FacingMode.right: 28 | return FacingMode.left; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/media/constraints/mirror_mode.dart: -------------------------------------------------------------------------------- 1 | enum MirrorMode { 2 | on, 3 | off, 4 | defaultMode, 5 | } 6 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/media/video_constraints.dart: -------------------------------------------------------------------------------- 1 | import '../model/rtc_video_parameters.dart'; 2 | import 'media_constraints.dart'; 3 | 4 | /// Base class for options when creating a video track. 5 | abstract class VideoConstraints extends MediaConstraints { 6 | const VideoConstraints({ 7 | super.deviceId, 8 | this.maxFrameRate, 9 | this.params = RtcVideoParametersPresets.h720_16x9, 10 | }); 11 | 12 | /// Limit the maximum frameRate of the capture device. 13 | final double? maxFrameRate; 14 | 15 | final RtcVideoParameters params; 16 | 17 | @override 18 | Map toMap() { 19 | return { 20 | 'width': params.dimension.width, 21 | 'height': params.dimension.height, 22 | 'frameRate': params.encoding.maxFramerate, 23 | }; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/rtc_audio_bitrate_preset.dart: -------------------------------------------------------------------------------- 1 | class AudioBitrate { 2 | static const telephone = 12000; 3 | static const speech = 20000; 4 | static const music = 32000; 5 | static const musicStereo = 48000; 6 | static const musicHighQuality = 64000; 7 | static const musicHighQualityStereo = 96000; 8 | } 9 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/rtc_model_mapper_extensions.dart: -------------------------------------------------------------------------------- 1 | import '../../../protobuf/video/sfu/models/models.pb.dart' as sfu_models; 2 | import 'rtc_video_dimension.dart'; 3 | 4 | extension SfuVideoDimensionMapper on RtcVideoDimension { 5 | sfu_models.VideoDimension toDTO() { 6 | return sfu_models.VideoDimension( 7 | width: width, 8 | height: height, 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_inbound_rtp.dart: -------------------------------------------------------------------------------- 1 | abstract class RtcInboundRtp {} 2 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_media_source.dart: -------------------------------------------------------------------------------- 1 | import 'rtc_stats.dart'; 2 | import 'rtc_writable.dart'; 3 | 4 | abstract class RtcMediaSource extends RtcStats implements RtcWritable { 5 | const RtcMediaSource({ 6 | super.id, 7 | super.type, 8 | super.timestamp, 9 | this.kind, 10 | this.trackIdentifier, 11 | }); 12 | 13 | final String? kind; 14 | final String? trackIdentifier; 15 | String? get codecId; 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_media_stream_track.dart: -------------------------------------------------------------------------------- 1 | abstract class RtcMediaStreamTrack { 2 | static const String propKind = 'kind'; 3 | static const String propRemoteSource = 'remoteSource'; 4 | } 5 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_outbound_rtp.dart: -------------------------------------------------------------------------------- 1 | abstract class RtcOutboundRtp {} 2 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_printable_stats.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | class RtcPrintableStats with EquatableMixin { 4 | const RtcPrintableStats({ 5 | required this.local, 6 | required this.remote, 7 | }); 8 | 9 | final String local; 10 | final String remote; 11 | 12 | @override 13 | String toString() { 14 | return 'RtcPrintableStats{local: $local, remote: $remote}'; 15 | } 16 | 17 | @override 18 | List get props => [local, remote]; 19 | } 20 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_raw_stats.dart: -------------------------------------------------------------------------------- 1 | class RtcRawStats {} 2 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_stats.dart: -------------------------------------------------------------------------------- 1 | abstract class RtcStats { 2 | const RtcStats({ 3 | this.id, 4 | this.type, 5 | this.timestamp, 6 | }); 7 | 8 | final String? id; 9 | final String? type; 10 | final double? timestamp; 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/model/stats/rtc_writable.dart: -------------------------------------------------------------------------------- 1 | // ignore: one_member_abstracts 2 | abstract class RtcWritable { 3 | void writeTo(StringBuffer out); 4 | } 5 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/peer_type.dart: -------------------------------------------------------------------------------- 1 | enum StreamPeerType { 2 | publisher, 3 | subscriber; 4 | 5 | @override 6 | String toString() => name; 7 | } 8 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/rtc_audio_api/rtc_audio_api.dart: -------------------------------------------------------------------------------- 1 | export 'rtc_audio_stub.dart' 2 | if (dart.library.html) 'rtc_audio_html.dart' 3 | if (dart.library.io) 'rtc_audio_native.dart'; 4 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/rtc_audio_api/rtc_audio_native.dart: -------------------------------------------------------------------------------- 1 | import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc; 2 | 3 | void startAudio(String id, rtc.MediaStreamTrack track) { 4 | // We don't need to do anything here, because the audio automatically starts 5 | // in native platforms. 6 | } 7 | 8 | void stopAudio(String id) { 9 | // We don't need to do anything here, because the audio automatically stops 10 | // in native platforms. 11 | } 12 | 13 | void setSinkId(String id, String deviceId) { 14 | // We don't need to do anything here, because sinkId is only supported in 15 | // web platforms. 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/rtc_audio_api/rtc_audio_stub.dart: -------------------------------------------------------------------------------- 1 | import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' as rtc; 2 | 3 | void startAudio(String id, rtc.MediaStreamTrack track) { 4 | throw UnimplementedError(); 5 | } 6 | 7 | void stopAudio(String id) { 8 | throw UnimplementedError(); 9 | } 10 | 11 | void setSinkId(String id, String deviceId) { 12 | throw UnimplementedError(); 13 | } 14 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/rtc_parser.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart'; 4 | 5 | mixin RtcIceCandidateParser { 6 | static RTCIceCandidate fromJsonString(String jsonText) { 7 | final iceCandidateJson = json.decode(jsonText) as Map; 8 | 9 | return RTCIceCandidate( 10 | iceCandidateJson['candidate'], 11 | iceCandidateJson['sdpMid'], 12 | iceCandidateJson['sdpMLineIndex'], 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/action/sdp_edit_action.dart: -------------------------------------------------------------------------------- 1 | import 'package:meta/meta.dart'; 2 | 3 | import '../../sdp.dart'; 4 | 5 | @internal 6 | // ignore: one_member_abstracts 7 | abstract class SdpEditAction { 8 | const SdpEditAction(); 9 | 10 | void execute(List sdpLines); 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/rule/rule_prioritize_codec.dart: -------------------------------------------------------------------------------- 1 | import '../../codec/sdp_codec.dart'; 2 | import '../../sdp.dart'; 3 | import 'sdp_munging_rule.dart'; 4 | 5 | class PrioritizeCodecRule extends SdpMungingRule { 6 | const PrioritizeCodecRule({ 7 | required this.codec, 8 | super.platforms, 9 | super.types = const [SdpType.localOffer], 10 | }); 11 | 12 | final SdpCodec codec; 13 | 14 | @override 15 | String get key => 'prioritize-codec-${codec.type}'; 16 | 17 | @override 18 | String toString() { 19 | return 'PrioritizeCodecRule{codec: $codec, ' 20 | 'types: $types, platforms: $platforms}'; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/rule/rule_set_opus_dtx_enabled.dart: -------------------------------------------------------------------------------- 1 | import '../../sdp.dart'; 2 | import 'sdp_munging_rule.dart'; 3 | 4 | class SetOpusDtxEnabledRule extends SdpMungingRule { 5 | const SetOpusDtxEnabledRule({ 6 | required this.enabled, 7 | super.platforms, 8 | super.types = const [SdpType.localOffer], 9 | }); 10 | 11 | final bool enabled; 12 | 13 | @override 14 | String get key => 'set-opus-dtx-enabled'; 15 | 16 | @override 17 | String toString() { 18 | return 'SetOpusDtxEnabledRule{enabled: $enabled, ' 19 | 'types: $types, platforms: $platforms}'; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/rule/rule_set_opus_red_enabled.dart: -------------------------------------------------------------------------------- 1 | import '../../editor/rule/sdp_munging_rule.dart'; 2 | import '../../sdp.dart'; 3 | 4 | class SetOpusRedEnabledRule extends SdpMungingRule { 5 | const SetOpusRedEnabledRule({ 6 | required this.enabled, 7 | super.platforms, 8 | super.types = const [SdpType.localOffer], 9 | }); 10 | 11 | final bool enabled; 12 | 13 | @override 14 | String get key => 'set-opus-red-enabled'; 15 | 16 | @override 17 | String toString() { 18 | return 'SetOpusRedEnabledRule{enabled: $enabled, ' 19 | 'types: $types, platforms: $platforms}'; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/rule/rule_toggle.dart: -------------------------------------------------------------------------------- 1 | import 'sdp_munging_rule.dart'; 2 | 3 | class SdpRuleToggle { 4 | SdpRuleToggle({ 5 | required this.rule, 6 | this.enabled = false, 7 | }); 8 | 9 | final SdpMungingRule rule; 10 | bool enabled; 11 | 12 | @override 13 | String toString() { 14 | return 'SdpRuleToggle{enabled: $enabled, rule: $rule}'; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/editor/sdp_editor.dart: -------------------------------------------------------------------------------- 1 | import 'package:meta/meta.dart'; 2 | 3 | import '../sdp.dart'; 4 | 5 | @internal 6 | abstract class SdpEditor { 7 | set opusDtxEnabled(bool value); 8 | 9 | set opusRedEnabled(bool value); 10 | 11 | String? edit(Sdp? sdp); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/webrtc/sdp/sdp.dart: -------------------------------------------------------------------------------- 1 | class Sdp { 2 | const Sdp(this.type, this.value); 3 | 4 | const Sdp.localOffer(String sdp) : this(SdpType.localOffer, sdp); 5 | 6 | const Sdp.localAnswer(String sdp) : this(SdpType.localAnswer, sdp); 7 | 8 | const Sdp.remoteOffer(String sdp) : this(SdpType.remoteOffer, sdp); 9 | 10 | const Sdp.remoteAnswer(String sdp) : this(SdpType.remoteAnswer, sdp); 11 | 12 | final SdpType type; 13 | final String value; 14 | } 15 | 16 | enum SdpType { 17 | localOffer, 18 | localAnswer, 19 | remoteOffer, 20 | remoteAnswer; 21 | 22 | @override 23 | String toString() => name; 24 | } 25 | 26 | typedef SdpLine = String; 27 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/ws/connect/connect.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:web_socket_channel/web_socket_channel.dart'; 4 | 5 | Future connect(Uri uri, {Iterable? protocols}) { 6 | throw UnsupportedError('No implementation of the connect api provided'); 7 | } 8 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/ws/connect/connect_html.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: avoid_web_libraries_in_flutter 2 | 3 | import 'dart:async'; 4 | 5 | import 'package:web/web.dart' as web; 6 | import 'package:web_socket_channel/html.dart'; 7 | import 'package:web_socket_channel/web_socket_channel.dart'; 8 | 9 | Future connect(Uri uri, {Iterable? protocols}) async { 10 | final completer = Completer(); 11 | final webSocket = web.WebSocket(uri.toString()) 12 | ..binaryType = BinaryType.list.value; 13 | 14 | unawaited( 15 | webSocket.onOpen.first.then((value) { 16 | completer.complete(HtmlWebSocketChannel(webSocket)); 17 | }), 18 | ); 19 | 20 | unawaited( 21 | webSocket.onError.first.then((err) { 22 | completer.completeError(WebSocketChannelException.from(err)); 23 | }), 24 | ); 25 | 26 | return completer.future; 27 | } 28 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/ws/connect/connect_io.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:web_socket_channel/io.dart'; 4 | import 'package:web_socket_channel/web_socket_channel.dart'; 5 | 6 | Future connect(Uri uri, {Iterable? protocols}) async { 7 | try { 8 | final webSocket = WebSocket.connect( 9 | uri.toString(), 10 | protocols: protocols, 11 | ); 12 | return IOWebSocketChannel(await webSocket); 13 | } on SocketException catch (err) { 14 | throw WebSocketChannelException.from(err); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video/lib/src/ws/socket_connection_state.dart: -------------------------------------------------------------------------------- 1 | /// Socket Connection state type used throughout the SDK. 2 | enum SocketConnectionState { 3 | disconnected, 4 | connecting, 5 | reconnecting, 6 | connected, 7 | } 8 | -------------------------------------------------------------------------------- /packages/stream_video/test/src/globals_test.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter_test/flutter_test.dart'; 4 | import 'package:pubspec_parse/pubspec_parse.dart'; 5 | import 'package:stream_video/globals.dart'; 6 | 7 | void main() { 8 | // test run on the root of the package, so the relative path is just pubspec.yaml 9 | const pubspecPath = 'pubspec.yaml'; 10 | 11 | test('verify version number', () { 12 | final pubspec = Pubspec.parse(File(pubspecPath).readAsStringSync()); 13 | final version = pubspec.version!; 14 | 15 | expect( 16 | streamVideoVersion, 17 | '${version.major}.${version.minor}.${version.patch}', 18 | ); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video/test/src/latency/latency_client_mock.dart: -------------------------------------------------------------------------------- 1 | import 'package:mocktail/mocktail.dart'; 2 | import 'package:stream_video/src/latency/latency_service.dart'; 3 | 4 | class LatencyClientMock extends Mock implements LatencyClient {} 5 | -------------------------------------------------------------------------------- /packages/stream_video/test/src/logger/impl/test_logger.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:stream_video/src/logger/stream_logger.dart'; 3 | 4 | class TestStreamLogger extends StreamLogger { 5 | int startTimeMs = DateTime.now().millisecondsSinceEpoch; 6 | 7 | int get nowMs => DateTime.now().millisecondsSinceEpoch; 8 | 9 | @override 10 | void log( 11 | Priority priority, 12 | String tag, 13 | MessageBuilder message, [ 14 | Object? error, 15 | StackTrace? stk, 16 | ]) { 17 | final elapsed = Duration(milliseconds: nowMs - startTimeMs); 18 | final emoji = super.emoji(priority); 19 | final name = super.name(priority); 20 | 21 | debugPrint('$elapsed $emoji ($name/$tag): ${message()}'); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/stream_video/test/src/types/rtc_configuration_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:stream_video/stream_video.dart' show RTCConfiguration; 3 | 4 | void main() { 5 | test('Verify default configurations', () { 6 | const sut = RTCConfiguration(); 7 | final map = sut.toMap(); 8 | 9 | expect(map['sdpSemantics'], 'unified-plan'); 10 | expect(map['bundlePolicy'], 'max-bundle'); 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .cxx 10 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | def flutterSdkPath = { 3 | def properties = new Properties() 4 | file("local.properties").withInputStream { properties.load(it) } 5 | def flutterSdkPath = properties.getProperty("flutter.sdk") 6 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 7 | return flutterSdkPath 8 | }() 9 | 10 | includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") 11 | 12 | repositories { 13 | google() 14 | mavenCentral() 15 | gradlePluginPortal() 16 | } 17 | } 18 | 19 | plugins { 20 | id "dev.flutter.flutter-plugin-loader" version "1.0.0" 21 | id "com.android.library" version "7.3.1" apply false 22 | id "org.jetbrains.kotlin.android" version "1.9.10" apply false 23 | } 24 | 25 | include ":app" 26 | 27 | rootProject.name = 'stream_video_flutter' 28 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/kotlin/flutter/embedding/android/FlutterEngine.kt: -------------------------------------------------------------------------------- 1 | package io.flutter.embedding.android 2 | 3 | import android.app.Activity 4 | 5 | val Activity.engine get() = when (this) { 6 | is FlutterActivity -> flutterEngine 7 | is FlutterFragmentActivity -> flutterEngine 8 | else -> null 9 | } 10 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/kotlin/flutter/embedding/android/FlutterFlags.kt: -------------------------------------------------------------------------------- 1 | package io.flutter.embedding.android 2 | 3 | object FlutterFlags { 4 | const val EXTRA_DESTROY_ENGINE_WITH_ACTIVITY = FlutterActivityLaunchConfigs.EXTRA_DESTROY_ENGINE_WITH_ACTIVITY 5 | } -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/kotlin/io/getstream/video/flutter/stream_video_flutter/StreamFlags.kt: -------------------------------------------------------------------------------- 1 | package io.getstream.video.flutter.stream_video_flutter 2 | 3 | const val STREAM_FLUTTER_BACKGROUND_ENGINE_ID = "stream_flutter_background_engine" -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/kotlin/io/getstream/video/flutter/stream_video_flutter/service/notification/StreamCallGuid.kt: -------------------------------------------------------------------------------- 1 | package io.getstream.video.flutter.stream_video_flutter.service.notification 2 | 3 | typealias StreamCallCid = String -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/kotlin/io/getstream/video/flutter/stream_video_flutter/videoFilters/common/BitmapVideoFilter.kt: -------------------------------------------------------------------------------- 1 | package io.getstream.video.flutter.stream_video_flutter.videoFilters.common 2 | 3 | import android.graphics.Bitmap 4 | 5 | /** 6 | * A filter that provides a Bitmap of each frame. It's less performant than using the 7 | * RawVideoFilter because we do YUV<->ARGB conversions internally. 8 | */ 9 | abstract class BitmapVideoFilter { 10 | abstract fun applyFilter(videoFrameBitmap: Bitmap) 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-hdpi/stream_ic_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/android/src/main/res/drawable-hdpi/stream_ic_cancel.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-mdpi/stream_ic_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/android/src/main/res/drawable-mdpi/stream_ic_cancel.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-v21/stream_bg_button_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-v21/stream_rounded_button_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-xhdpi/stream_ic_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/android/src/main/res/drawable-xhdpi/stream_ic_cancel.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-xxhdpi/stream_ic_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/android/src/main/res/drawable-xxhdpi/stream_ic_cancel.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable-xxxhdpi/stream_ic_cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/android/src/main/res/drawable-xxxhdpi/stream_ic_cancel.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable/stream_bg_button_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/drawable/stream_rounded_button_cancel.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/values/stream_colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | #4CAF50 5 | #A6FFA9 6 | #F44336 7 | #FB8D85 8 | 9 | #FFFFFF 10 | #80ffffff 11 | 12 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/values/stream_ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | stream_call_GetStreamClient 7 | Stream Call 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/android/src/main/res/values/stream_strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Accept 5 | Reject 6 | Cancel 7 | %1$s presenting 8 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | **/*.keystore 13 | **/*.jks 14 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | #Flutter Wrapper 2 | -keep class io.flutter.plugin.** { *; } 3 | -keep class io.flutter.util.** { *; } 4 | -keep class io.flutter.view.** { *; } 5 | -keep class io.flutter.plugins.** { *; } 6 | 7 | -keep class com.hiennv.flutter_callkit_incoming.** { *; } 8 | 9 | -keep class java.beans.Transient.** {*;} 10 | -keep class java.beans.ConstructorProperties.** {*;} 11 | -keep class java.nio.file.Path.** {*;} 12 | 13 | -dontwarn java.beans.ConstructorProperties 14 | -dontwarn java.beans.Transient 15 | -dontwarn org.conscrypt.Conscrypt 16 | -dontwarn org.conscrypt.OpenSSLProvider 17 | -dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/kotlin/io/getstream/video/flutter/dogfooding/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package io.getstream.video.flutter.dogfooding 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/build.gradle: -------------------------------------------------------------------------------- 1 | allprojects { 2 | repositories { 3 | google() 4 | mavenCentral() 5 | } 6 | } 7 | 8 | rootProject.buildDir = '../build' 9 | subprojects { 10 | project.buildDir = "${rootProject.buildDir}/${project.name}" 11 | } 12 | subprojects { 13 | project.evaluationDependsOn(':app') 14 | } 15 | 16 | tasks.register("clean", Delete) { 17 | delete rootProject.buildDir 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2000M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | android.defaults.buildfeatures.buildconfig=true 5 | android.nonTransitiveRClass=false 6 | android.nonFinalResIds=false -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Tue Feb 18 10:31:16 CET 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dists 7 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/.gitignore: -------------------------------------------------------------------------------- 1 | **/dgph 2 | *.mode1v3 3 | *.mode2v3 4 | *.moved-aside 5 | *.pbxuser 6 | *.perspectivev3 7 | **/*sync/ 8 | .sconsign.dblite 9 | .tags* 10 | **/.vagrant/ 11 | **/DerivedData/ 12 | Icon? 13 | **/Pods/ 14 | **/.symlinks/ 15 | profile 16 | xcuserdata 17 | **/.generated/ 18 | Flutter/App.framework 19 | Flutter/Flutter.framework 20 | Flutter/Flutter.podspec 21 | Flutter/Generated.xcconfig 22 | Flutter/ephemeral/ 23 | Flutter/app.flx 24 | Flutter/app.zip 25 | Flutter/flutter_assets/ 26 | Flutter/flutter_export_environment.sh 27 | ServiceDefinitions.json 28 | Runner/GeneratedPluginRegistrant.* 29 | 30 | # Exceptions to above rules. 31 | !default.mode1v3 32 | !default.mode2v3 33 | !default.pbxuser 34 | !default.perspectivev3 35 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @main 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/ios/RunnerTests/RunnerTests.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | import XCTest 4 | 5 | @testable import stream_video_flutter 6 | 7 | // This demonstrates a simple unit test of the Swift portion of this plugin's implementation. 8 | // 9 | // See https://developer.apple.com/documentation/xctest for more information about using XCTest. 10 | 11 | class RunnerTests: XCTestCase { 12 | 13 | func testGetPlatformVersion() { 14 | let plugin = StreamVideoFlutterPlugin() 15 | 16 | let call = FlutterMethodCall(methodName: "getPlatformVersion", arguments: []) 17 | 18 | let resultExpectation = expectation(description: "result block must be called.") 19 | plugin.handle(call) { result in 20 | XCTAssertEqual(result as! String, "iOS " + UIDevice.current.systemVersion) 21 | resultExpectation.fulfill() 22 | } 23 | waitForExpectations(timeout: 1) 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/lib/proxy/proxy.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | void useProxy(String proxy) { 4 | HttpOverrides.global = ProxiedHttpOverrides(proxy); 5 | } 6 | 7 | class ProxiedHttpOverrides extends HttpOverrides { 8 | ProxiedHttpOverrides(this._proxy); 9 | final String _proxy; 10 | 11 | @override 12 | HttpClient createHttpClient(SecurityContext? context) { 13 | return super.createHttpClient(context) 14 | ..findProxy = (uri) { 15 | return _proxy.isNotEmpty ? 'PROXY $_proxy;' : 'DIRECT'; 16 | } 17 | ..badCertificateCallback = 18 | (X509Certificate cert, String host, int port) => Platform.isAndroid; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/lib/utils.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | extension BuildContextExtension on BuildContext { 4 | void showSnackBar(String message) { 5 | ScaffoldMessenger.of(this) 6 | ..removeCurrentSnackBar() 7 | ..showSnackBar( 8 | SnackBar( 9 | content: Text(message), 10 | backgroundColor: Colors.red, 11 | shape: const RoundedRectangleBorder( 12 | borderRadius: BorderRadius.only( 13 | topLeft: Radius.circular(8), 14 | topRight: Radius.circular(8), 15 | ), 16 | ), 17 | ), 18 | ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/linux/flutter/generated_plugin_registrant.cc: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #include "generated_plugin_registrant.h" 8 | 9 | #include 10 | #include 11 | 12 | void fl_register_plugins(FlPluginRegistry* registry) { 13 | g_autoptr(FlPluginRegistrar) stream_webrtc_flutter_registrar = 14 | fl_plugin_registry_get_registrar_for_plugin(registry, "FlutterWebRTCPlugin"); 15 | flutter_web_r_t_c_plugin_register_with_registrar(stream_webrtc_flutter_registrar); 16 | g_autoptr(FlPluginRegistrar) url_launcher_linux_registrar = 17 | fl_plugin_registry_get_registrar_for_plugin(registry, "UrlLauncherPlugin"); 18 | url_launcher_plugin_register_with_registrar(url_launcher_linux_registrar); 19 | } 20 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/linux/flutter/generated_plugin_registrant.h: -------------------------------------------------------------------------------- 1 | // 2 | // Generated file. Do not edit. 3 | // 4 | 5 | // clang-format off 6 | 7 | #ifndef GENERATED_PLUGIN_REGISTRANT_ 8 | #define GENERATED_PLUGIN_REGISTRANT_ 9 | 10 | #include 11 | 12 | // Registers Flutter plugins. 13 | void fl_register_plugins(FlPluginRegistry* registry); 14 | 15 | #endif // GENERATED_PLUGIN_REGISTRANT_ 16 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/linux/main.cc: -------------------------------------------------------------------------------- 1 | #include "my_application.h" 2 | 3 | int main(int argc, char** argv) { 4 | g_autoptr(MyApplication) app = my_application_new(); 5 | return g_application_run(G_APPLICATION(app), argc, argv); 6 | } 7 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/linux/my_application.h: -------------------------------------------------------------------------------- 1 | #ifndef FLUTTER_MY_APPLICATION_H_ 2 | #define FLUTTER_MY_APPLICATION_H_ 3 | 4 | #include 5 | 6 | G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, 7 | GtkApplication) 8 | 9 | /** 10 | * my_application_new: 11 | * 12 | * Creates a new Flutter-based application. 13 | * 14 | * Returns: a new #MyApplication. 15 | */ 16 | MyApplication* my_application_new(); 17 | 18 | #endif // FLUTTER_MY_APPLICATION_H_ 19 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Flutter/Flutter-Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Flutter/Flutter-Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "ephemeral/Flutter-Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | @main 5 | class AppDelegate: FlutterAppDelegate { 6 | override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { 7 | return true 8 | } 9 | 10 | override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { 11 | return true 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Configs/AppInfo.xcconfig: -------------------------------------------------------------------------------- 1 | // Application-level settings for the Runner target. 2 | // 3 | // This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the 4 | // future. If not, the values below would default to using the project name when this becomes a 5 | // 'flutter create' template. 6 | 7 | // The application's name. By default this is also the title of the Flutter window. 8 | PRODUCT_NAME = example 9 | 10 | // The application's bundle identifier 11 | PRODUCT_BUNDLE_IDENTIFIER = com.example.example 12 | 13 | // The copyright displayed in application information 14 | PRODUCT_COPYRIGHT = Copyright © 2022 com.example. All rights reserved. 15 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Configs/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Debug.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Configs/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "../../Flutter/Flutter-Release.xcconfig" 2 | #include "Warnings.xcconfig" 3 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Configs/Warnings.xcconfig: -------------------------------------------------------------------------------- 1 | WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings 2 | GCC_WARN_UNDECLARED_SELECTOR = YES 3 | CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES 4 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE 5 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES 6 | CLANG_WARN_PRAGMA_PACK = YES 7 | CLANG_WARN_STRICT_PROTOTYPES = YES 8 | CLANG_WARN_COMMA = YES 9 | GCC_WARN_STRICT_SELECTOR_MATCH = YES 10 | CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES 11 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES 12 | GCC_WARN_SHADOW = YES 13 | CLANG_WARN_UNREACHABLE_CODE = YES 14 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/DebugProfile.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.network.server 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/MainFlutterWindow.swift: -------------------------------------------------------------------------------- 1 | import Cocoa 2 | import FlutterMacOS 3 | 4 | class MainFlutterWindow: NSWindow { 5 | override func awakeFromNib() { 6 | let flutterViewController = FlutterViewController.init() 7 | let windowFrame = self.frame 8 | self.contentViewController = flutterViewController 9 | self.setFrame(windowFrame, display: true) 10 | 11 | RegisterGeneratedPlugins(registry: flutterViewController) 12 | 13 | super.awakeFromNib() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/macos/Runner/Release.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | com.apple.security.device.audio-input 10 | 11 | com.apple.security.device.camera 12 | 13 | com.apple.security.network.client 14 | 15 | com.apple.security.network.server 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/web/favicon.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/web/icons/Icon-192.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/web/icons/Icon-512.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/web/icons/Icon-maskable-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/web/icons/Icon-maskable-192.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/web/icons/Icon-maskable-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/web/icons/Icon-maskable-512.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/windows/runner/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Runner.rc 4 | // 5 | #define IDI_APP_ICON 101 6 | 7 | // Next default values for new objects 8 | // 9 | #ifdef APSTUDIO_INVOKED 10 | #ifndef APSTUDIO_READONLY_SYMBOLS 11 | #define _APS_NEXT_RESOURCE_VALUE 102 12 | #define _APS_NEXT_COMMAND_VALUE 40001 13 | #define _APS_NEXT_CONTROL_VALUE 1001 14 | #define _APS_NEXT_SYMED_VALUE 101 15 | #endif 16 | #endif 17 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/windows/runner/resources/app_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/example/windows/runner/resources/app_icon.ico -------------------------------------------------------------------------------- /packages/stream_video_flutter/example/windows/runner/utils.h: -------------------------------------------------------------------------------- 1 | #ifndef RUNNER_UTILS_H_ 2 | #define RUNNER_UTILS_H_ 3 | 4 | #include 5 | #include 6 | 7 | // Creates a console for the process, and redirects stdout and stderr to 8 | // it for both the runner and the Flutter library. 9 | void CreateAndAttachConsole(); 10 | 11 | // Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string 12 | // encoded in UTF-8. Returns an empty std::string on failure. 13 | std::string Utf8FromUtf16(const wchar_t* utf16_string); 14 | 15 | // Gets the command line arguments passed in as a std::vector, 16 | // encoded in UTF-8. Returns an empty std::vector on failure. 17 | std::vector GetCommandLineArguments(); 18 | 19 | #endif // RUNNER_UTILS_H_ 20 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/fonts/StreamIcons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/fonts/StreamIcons.ttf -------------------------------------------------------------------------------- /packages/stream_video_flutter/images/call_background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/images/call_background.jpg -------------------------------------------------------------------------------- /packages/stream_video_flutter/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /packages/stream_video_flutter/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /packages/stream_video_flutter/ios/Classes/PictureInPicture/WindowSizePolicy/StreamPictureInPictureWindowSizePolicy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © 2024 Stream.io Inc. All rights reserved. 3 | // 4 | 5 | import Foundation 6 | 7 | /// Protocol defining the policy for determining the window size of a Picture-in-Picture (PiP) view. 8 | protocol PictureInPictureWindowSizePolicy { 9 | /// The current size of the track to be displayed in the PiP window. 10 | var trackSize: CGSize { get set } 11 | 12 | /// The controller that manages the PiP view. 13 | var controller: StreamAVPictureInPictureViewControlling? { get set } 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/ios/Classes/VideoFrameProcessors/Utils/UIDevice+NeuralEngine.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © 2024 Stream.io Inc. All rights reserved. 3 | // 4 | 5 | #if canImport(MLCompute) 6 | import MLCompute 7 | let neuralEngineExists = { 8 | if #available(iOS 15.0, *) { 9 | return MLCDevice.ane() != nil 10 | } else { 11 | return false 12 | } 13 | }() 14 | #else 15 | let neuralEngineExists = false 16 | #endif 17 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/l10n.yaml: -------------------------------------------------------------------------------- 1 | synthetic-package: false 2 | arb-dir: lib/src/l10n/arb 3 | output-dir: lib/src/l10n/localizations 4 | template-arb-file: stream_video_flutter_en.arb 5 | output-localization-file: stream_video_flutter_localizations.dart 6 | output-class: StreamVideoFlutterLocalizations -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/call_background/model/notification_payload.dart: -------------------------------------------------------------------------------- 1 | import 'package:equatable/equatable.dart'; 2 | 3 | import 'notification_options.dart'; 4 | 5 | class NotificationPayload with EquatableMixin { 6 | const NotificationPayload({ 7 | required this.callCid, 8 | this.options, 9 | }); 10 | 11 | final String callCid; 12 | final NotificationOptions? options; 13 | 14 | Map toJson() { 15 | return { 16 | 'call_cid': callCid, 17 | 'options': options?.toJson(), 18 | }; 19 | } 20 | 21 | @override 22 | bool? get stringify => true; 23 | 24 | @override 25 | List get props => [callCid, options]; 26 | } 27 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/call_background/model/service_type.dart: -------------------------------------------------------------------------------- 1 | enum ServiceType { 2 | call, 3 | screenSharing, 4 | } 5 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/call_controls/controls/default_control_options.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../stream_video_flutter.dart'; 4 | 5 | /// Builds the default set of call control options. 6 | List defaultCallControlOptions({ 7 | required Call call, 8 | required CallParticipantState localParticipant, 9 | }) { 10 | return [ 11 | ToggleSpeakerphoneOption(call: call), 12 | ToggleCameraOption(call: call, localParticipant: localParticipant), 13 | ToggleMicrophoneOption(call: call, localParticipant: localParticipant), 14 | FlipCameraOption(call: call, localParticipant: localParticipant), 15 | ]; 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/call_participants/layout/participant_layout_mode.dart: -------------------------------------------------------------------------------- 1 | import 'package:stream_video/stream_video.dart'; 2 | 3 | enum ParticipantLayoutMode { 4 | /// The layout mode is set to grid view. 5 | grid, 6 | 7 | /// The layout mode is set to spotlight view. 8 | spotlight, 9 | 10 | pictureInPicture; 11 | } 12 | 13 | extension SortingExtension on ParticipantLayoutMode { 14 | Comparator get sorting { 15 | switch (this) { 16 | case ParticipantLayoutMode.grid: 17 | return CallParticipantSortingPresets.regular; 18 | case ParticipantLayoutMode.spotlight: 19 | return CallParticipantSortingPresets.speaker; 20 | case ParticipantLayoutMode.pictureInPicture: 21 | return CallParticipantSortingPresets.speaker; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/l10n/arb/stream_video_flutter_nl.arb: -------------------------------------------------------------------------------- 1 | { 2 | "desktopScreenShareChooseDialogTitle": "Kies wat je wilt delen", 3 | "desktopScreenShareChooseDialogShare": "Delen", 4 | "desktopScreenShareChooseDialogCancel": "Annuleren", 5 | "desktopScreenShareEntireScreen": "Volledig scherm", 6 | "desktopScreenShareWindow": "Venster", 7 | "livestreamBackstageStartingSoon": "Livestream begint binnenkort", 8 | "livestreamBackstageStartingIn": "Livestream begint over:", 9 | "livestreamBackstageParticipants": "{count, plural, zero{Nog geen deelnemers zijn} one{Eén deelnemer is} other{{count} deelnemers zijn}} vroeg aanwezig", 10 | "livestreamEndedStatus": "De livestream is afgelopen.", 11 | "livestreamEndedWatchRecordings": "Bekijk de opnames:", 12 | "livestreamHostNotAvailable": "De video van de host is niet beschikbaar.", 13 | "livestreamBackstage": "Backstage", 14 | "livestreamLive": "Live" 15 | } -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/l10n/localization_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | import 'localizations/stream_video_flutter_localizations.dart'; 4 | import 'localizations/stream_video_flutter_localizations_en.dart'; 5 | 6 | extension LocalizationExtension on BuildContext { 7 | /// Retrieves current translations according to locale 8 | /// Defaults to [StreamVideoFlutterLocalizationsEn] 9 | StreamVideoFlutterLocalizations get translations => 10 | StreamVideoFlutterLocalizations.of(this) ?? 11 | StreamVideoFlutterLocalizationsEn(); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/models/mute_toggle_titles.dart: -------------------------------------------------------------------------------- 1 | /// Contains titles for muted and unmuted states. 2 | class MuteToggleTitles { 3 | /// Creates a new instance of [MuteToggleTitles]. 4 | const MuteToggleTitles({ 5 | required this.muteTitle, 6 | required this.unmuteTitle, 7 | }); 8 | 9 | /// Title for unmuted state. 10 | final String muteTitle; 11 | 12 | /// Title for muted state. 13 | final String unmuteTitle; 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/models/stream_icon_toggle.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | /// Contains icons for active and inactive states accordingly. 4 | class StreamIconToggle { 5 | /// Creates a new instance of [StreamIconToggle]. 6 | const StreamIconToggle({ 7 | required this.active, 8 | required this.inactive, 9 | }); 10 | 11 | /// Icon for active state. 12 | final IconData active; 13 | 14 | /// Icon for inactive state. 15 | final IconData inactive; 16 | } 17 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/screen_share/screen_share.dart: -------------------------------------------------------------------------------- 1 | export 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart' 2 | show DesktopCapturerSource, SourceType; 3 | 4 | export 'desktop_screen_selector.dart'; 5 | export 'screen_selector_state_notifier.dart'; 6 | export 'screen_share_thumbnail_widget.dart'; 7 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/screen_share/screen_share_logger.dart: -------------------------------------------------------------------------------- 1 | import 'package:stream_video/stream_video.dart'; 2 | 3 | const _tag = 'SV:DesktopScreenShare'; 4 | const screenShareLogger = TaggedLogger(_tag); 5 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/theme/stream_icons.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | 3 | class StreamIcons { 4 | StreamIcons._(); 5 | 6 | static const _kFontFam = 'StreamIcons'; 7 | static const _kFontPkg = 'stream_video_flutter'; 8 | 9 | static const IconData spotlight = 10 | IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); 11 | static const IconData grid = 12 | IconData(0xe801, fontFamily: _kFontFam, fontPackage: _kFontPkg); 13 | static const IconData fullscreen = 14 | IconData(0xe802, fontFamily: _kFontFam, fontPackage: _kFontPkg); 15 | } 16 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/theme/themes.dart: -------------------------------------------------------------------------------- 1 | export 'call_content_theme.dart'; 2 | export 'call_controls_theme.dart'; 3 | export 'call_participant_theme.dart'; 4 | export 'incoming_outgoing_call_theme.dart'; 5 | export 'lobby_view_theme.dart'; 6 | export 'local_video_theme.dart'; 7 | export 'stream_color_theme.dart'; 8 | export 'stream_livestream_theme.dart'; 9 | export 'stream_text_theme.dart'; 10 | export 'stream_video_theme.dart'; 11 | export 'user_avatar_theme.dart'; 12 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/src/widgets/floating_view/floating_view_alignment.dart: -------------------------------------------------------------------------------- 1 | /// Positions the floating view in its container. 2 | enum FloatingViewAlignment { 3 | /// Aligns the floating view to the top left corner. 4 | topLeft, 5 | 6 | /// Aligns the floating view to the top right corner. 7 | topRight, 8 | 9 | /// Aligns the floating view to the bottom left corner. 10 | bottomLeft, 11 | 12 | /// Aligns the floating view to the bottom right corner. 13 | bottomRight, 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/lib/stream_video_flutter_l10n.dart: -------------------------------------------------------------------------------- 1 | export 'src/l10n/custom_stream_video_localizations_delegate.dart'; 2 | export 'src/l10n/localizations/stream_video_flutter_localizations.dart'; 3 | export 'src/l10n/localizations/stream_video_flutter_localizations_en.dart'; 4 | export 'src/l10n/localizations/stream_video_flutter_localizations_nl.dart'; 5 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/test/flutter_test_config.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:io'; 3 | 4 | import 'package:alchemist/alchemist.dart'; 5 | 6 | Future testExecutable(FutureOr Function() testMain) async { 7 | final isRunningInCi = Platform.environment.containsKey('CI') || 8 | Platform.environment.containsKey('GITHUB_ACTIONS'); 9 | 10 | return AlchemistConfig.runWithConfig( 11 | config: AlchemistConfig( 12 | platformGoldensConfig: PlatformGoldensConfig( 13 | enabled: !isRunningInCi, 14 | ), 15 | ), 16 | run: testMain, 17 | ); 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video_flutter/test/src/call_screen/call_content/goldens/ci/stream_call_content_extend_body_false.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/test/src/call_screen/call_content/goldens/ci/stream_call_content_extend_body_false.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/test/src/call_screen/call_content/goldens/ci/stream_call_content_extend_body_true.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_flutter/test/src/call_screen/call_content/goldens/ci/stream_call_content_extend_body_true.png -------------------------------------------------------------------------------- /packages/stream_video_flutter/test/test_utils/test_wrapper.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class TestWrapper extends StatelessWidget { 4 | const TestWrapper({super.key, required this.child}); 5 | 6 | final Widget child; 7 | 8 | @override 9 | Widget build(BuildContext context) { 10 | return MaterialApp( 11 | home: Scaffold(body: child), 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .build/ 9 | .buildlog/ 10 | .history 11 | .svn/ 12 | .swiftpm/ 13 | migrate_working_dir/ 14 | 15 | # IntelliJ related 16 | *.iml 17 | *.ipr 18 | *.iws 19 | .idea/ 20 | 21 | # The .vscode folder contains launch configuration and tasks you configure in 22 | # VS Code which you may wish to be included in version control, so this line 23 | # is commented out by default. 24 | #.vscode/ 25 | 26 | # Flutter/Dart/Pub related 27 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 28 | /pubspec.lock 29 | **/doc/api/ 30 | .dart_tool/ 31 | .flutter-plugins 32 | .flutter-plugins-dependencies 33 | build/ 34 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 0.9.5 2 | * Sync version with `stream_video_flutter` 0.9.5 3 | 4 | ## 0.9.4 5 | * Sync version with `stream_video_flutter` 0.9.4 6 | 7 | ## 0.9.3 8 | * Sync version with `stream_video_flutter` 0.9.3 9 | 10 | ## 0.9.2 11 | * Sync version with `stream_video_flutter` 0.9.2 12 | 13 | ## 0.9.1 14 | * Sync version with `stream_video_flutter` 0.9.1 15 | 16 | ## 0.9.0 17 | 18 | ✅ Added 19 | * Introducing noise cancellation support to enhance call audio quality. Implement this feature easily by following our [documentation](https://getstream.io/video/docs/flutter/guides/noise-cancellation/). 20 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/README.md: -------------------------------------------------------------------------------- 1 | ## Stream Video Noise Cancellation 2 | Noise cancellation feature implementation for Stream Video Flutter SDK. Please see the official package `stream_video_flutter` for detailed information on how it can be used. 3 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .cxx 10 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'stream_video_noise_cancellation' 2 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/android/src/main/kotlin/io/getstream/video/flutter/stream_video_noise_cancellation/NoiseCancellationAudioProcessingController.kt: -------------------------------------------------------------------------------- 1 | package io.getstream.video.flutter.stream_video_noise_cancellation 2 | 3 | import android.content.Context 4 | import org.webrtc.AudioProcessingFactory 5 | import io.getstream.webrtc.flutter.audio.AudioProcessingFactoryProvider 6 | import io.getstream.video.android.noise.cancellation.NoiseCancellation 7 | 8 | class NoiseCancellationAudioProcessingController(context: Context) : AudioProcessingFactoryProvider { 9 | val noiseCancellation: NoiseCancellation 10 | 11 | init { 12 | noiseCancellation = NoiseCancellation(context) 13 | } 14 | 15 | override fun getFactory(): AudioProcessingFactory { 16 | return noiseCancellation 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh 39 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_noise_cancellation/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/ios/Classes/AudioFilters.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Copyright © 2024 Stream.io Inc. All rights reserved. 3 | 4 | // 5 | 6 | import Foundation 7 | import stream_webrtc_flutter 8 | 9 | /// AudioFilter protocol defines the structure for audio filtering implementations. 10 | public protocol AudioFilter: Sendable { 11 | /// Unique identifier for the audio filter. 12 | var id: String { get } 13 | 14 | /// Initializes the audio filter with specified sample rate and number of channels. 15 | func initialize(sampleRate: Int, channels: Int) 16 | 17 | /// Applies the defined audio effect to the given audio buffer. 18 | func applyEffect(to audioBuffer: inout RTCAudioBuffer) 19 | 20 | /// Releases resources associated with the audio filter. 21 | func release() 22 | } 23 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/ios/Classes/NeuralEngineProvider.swift: -------------------------------------------------------------------------------- 1 | #if canImport(MLCompute) 2 | import MLCompute 3 | let neuralEngineExists = { 4 | if #available(iOS 15.0, *) { 5 | return MLCDevice.ane() != nil 6 | } else { 7 | return false 8 | } 9 | }() 10 | #else 11 | let neuralEngineExists = false 12 | #endif 13 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/ios/Resources/PrivacyInfo.xcprivacy: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSPrivacyTrackingDomains 6 | 7 | NSPrivacyAccessedAPITypes 8 | 9 | NSPrivacyCollectedDataTypes 10 | 11 | NSPrivacyTracking 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/lib/stream_video_noise_cancellation.dart: -------------------------------------------------------------------------------- 1 | import 'stream_video_noise_cancellation_platform_interface.dart'; 2 | 3 | class StreamVideoNoiseCancellation { 4 | Future registerProcessor() { 5 | return StreamVideoNoiseCancellationPlatform.instance.registerProcessor(); 6 | } 7 | 8 | Future isEnabled() { 9 | return StreamVideoNoiseCancellationPlatform.instance.isEnabled(); 10 | } 11 | 12 | Future setEnabled(bool enabled) { 13 | return StreamVideoNoiseCancellationPlatform.instance.setEnabled(enabled); 14 | } 15 | 16 | Future deviceSupportsAdvancedAudioProcessing() { 17 | return StreamVideoNoiseCancellationPlatform.instance 18 | .deviceSupportsAdvancedAudioProcessing(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/test/mock_noise_cancellation_platform.dart: -------------------------------------------------------------------------------- 1 | import 'package:stream_video_noise_cancellation/stream_video_noise_cancellation_platform_interface.dart'; 2 | 3 | class FakeNoiseCancellationPlatform 4 | extends StreamVideoNoiseCancellationPlatform { 5 | int registerProcessorCallCount = 0; 6 | 7 | @override 8 | Future registerProcessor() async { 9 | registerProcessorCallCount++; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/stream_video_noise_cancellation/test/noise_cancellation_audio_processor_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:stream_video_noise_cancellation/noise_cancellation_audio_processor.dart'; 3 | import 'package:stream_video_noise_cancellation/stream_video_noise_cancellation_platform_interface.dart'; 4 | 5 | import 'mock_noise_cancellation_platform.dart'; 6 | 7 | void main() { 8 | test('NoiseCancellationAudioProcessor init registers processor', () async { 9 | final platform = FakeNoiseCancellationPlatform(); 10 | StreamVideoNoiseCancellationPlatform.instance = platform; 11 | 12 | expect(platform.registerProcessorCallCount, 0); 13 | 14 | final _ = NoiseCancellationAudioProcessor(); 15 | await Future.delayed(const Duration()); 16 | 17 | expect(platform.registerProcessorCallCount, 1); 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 26 | /pubspec.lock 27 | **/doc/api/ 28 | .dart_tool/ 29 | .packages 30 | build/ 31 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/README.md: -------------------------------------------------------------------------------- 1 | ## Stream Video Push Notifications 2 | Push notification support for Stream Video. Please see the official package `stream_video_flutter` for detailed information on how it can be used. 3 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/android/.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | .cxx 10 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zip 5 | networkTimeout=10000 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /packages/stream_video_push_notification/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_push_notification/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /packages/stream_video_push_notification/ios/Classes/StreamVideoPushParams.swift: -------------------------------------------------------------------------------- 1 | import flutter_callkit_incoming 2 | 3 | @objc public class StreamVideoPushParams: NSObject { 4 | public var callKitData: flutter_callkit_incoming.Data; 5 | 6 | public init(args: [String: Any?]) { 7 | self.callKitData = flutter_callkit_incoming.Data.init(args: args) 8 | } 9 | 10 | public func toJSON() -> [String: Any] { 11 | var map = callKitData.toJSON() 12 | return map 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/stream_video_push_notification/lib/stream_video_push_notification.dart: -------------------------------------------------------------------------------- 1 | library stream_video_push_notification; 2 | 3 | export 'package:flutter_callkit_incoming/entities/entities.dart' 4 | show IOSParams, AndroidParams, NotificationParams; 5 | 6 | export 'src/stream_video_push_notification.dart' 7 | hide StreamTokenProvider, StreamCallKit; 8 | export 'src/stream_video_push_params.dart'; 9 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | migrate_working_dir/ 12 | 13 | # IntelliJ related 14 | *.iml 15 | *.ipr 16 | *.iws 17 | .idea/ 18 | 19 | # The .vscode folder contains launch configuration and tasks you configure in 20 | # VS Code which you may wish to be included in version control, so this line 21 | # is commented out by default. 22 | #.vscode/ 23 | 24 | # Flutter/Dart/Pub related 25 | # Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. 26 | /pubspec.lock 27 | **/doc/api/ 28 | .dart_tool/ 29 | build/ 30 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/README.md: -------------------------------------------------------------------------------- 1 | ## Stream Video Screen Sharing 2 | This plugin includes a native Swift implementation of `BroadcastSampleHandler`, essential for the `broadcast` screen sharing mode on iOS. For more information, you can refer to the relevant documentation [here](https://getstream.io/video/docs/flutter/advanced/screen_sharing/#ios). -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | 3 | # Additional information about this file can be found at 4 | # https://dart.dev/guides/language/analysis-options 5 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/ios/.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .vagrant/ 3 | .sconsign.dblite 4 | .svn/ 5 | 6 | .DS_Store 7 | *.swp 8 | profile 9 | 10 | DerivedData/ 11 | build/ 12 | GeneratedPluginRegistrant.h 13 | GeneratedPluginRegistrant.m 14 | 15 | .generated/ 16 | 17 | *.pbxuser 18 | *.mode1v3 19 | *.mode2v3 20 | *.perspectivev3 21 | 22 | !default.pbxuser 23 | !default.mode1v3 24 | !default.mode2v3 25 | !default.perspectivev3 26 | 27 | xcuserdata 28 | 29 | *.moved-aside 30 | 31 | *.pyc 32 | *sync/ 33 | Icon? 34 | .tags* 35 | 36 | /Flutter/Generated.xcconfig 37 | /Flutter/ephemeral/ 38 | /Flutter/flutter_export_environment.sh -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/ios/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GetStream/stream-video-flutter/7ca6f77c2827874411eb2afc123e3f1b1a0777c4/packages/stream_video_screen_sharing/ios/Assets/.gitkeep -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/ios/Classes/Atomic.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | @propertyWrapper 4 | struct Atomic { 5 | 6 | private var value: Value 7 | private let lock = NSLock() 8 | 9 | init(wrappedValue value: Value) { 10 | self.value = value 11 | } 12 | 13 | var wrappedValue: Value { 14 | get { load() } 15 | set { store(newValue: newValue) } 16 | } 17 | 18 | func load() -> Value { 19 | lock.lock() 20 | defer { lock.unlock() } 21 | return value 22 | } 23 | 24 | mutating func store(newValue: Value) { 25 | lock.lock() 26 | defer { lock.unlock() } 27 | value = newValue 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/ios/Classes/StreamVideoScreenSharingPlugin.swift: -------------------------------------------------------------------------------- 1 | import Flutter 2 | import UIKit 3 | 4 | public class StreamVideoScreenSharingPlugin: NSObject, FlutterPlugin { 5 | public static func register(with registrar: FlutterPluginRegistrar) { 6 | let channel = FlutterMethodChannel(name: "stream_video_screen_sharing", binaryMessenger: registrar.messenger()) 7 | let instance = StreamVideoScreenSharingPlugin() 8 | registrar.addMethodCallDelegate(instance, channel: channel) 9 | } 10 | 11 | public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { 12 | switch call.method { 13 | default: 14 | result(FlutterMethodNotImplemented) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/lib/stream_video_screen_sharing_method_channel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/foundation.dart'; 2 | import 'package:flutter/services.dart'; 3 | 4 | import 'stream_video_screen_sharing_platform_interface.dart'; 5 | 6 | /// An implementation of [StreamVideoScreenSharingPlatform] that uses method channels. 7 | class MethodChannelStreamVideoScreenSharing 8 | extends StreamVideoScreenSharingPlatform { 9 | /// The method channel used to interact with the native platform. 10 | @visibleForTesting 11 | final methodChannel = const MethodChannel('stream_video_screen_sharing'); 12 | } 13 | -------------------------------------------------------------------------------- /packages/stream_video_screen_sharing/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: stream_video_screen_sharing 2 | description: > 3 | Official Screen Sharing Plugin for Stream Video Flutter that enables sharing device screens 4 | during video calls. 5 | version: 0.9.5 6 | homepage: https://getstream.io/video/ 7 | repository: https://github.com/GetStream/stream-video-flutter 8 | issue_tracker: https://github.com/GetStream/stream-video-flutter/issues 9 | 10 | environment: 11 | sdk: ^3.6.2 12 | flutter: ">=3.27.4" 13 | 14 | dependencies: 15 | flutter: 16 | sdk: flutter 17 | plugin_platform_interface: ^2.1.8 18 | 19 | dev_dependencies: 20 | flutter_test: 21 | sdk: flutter 22 | flutter_lints: ^3.0.0 23 | 24 | flutter: 25 | plugin: 26 | platforms: 27 | ios: 28 | pluginClass: StreamVideoScreenSharingPlugin 29 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: stream_video_flutter_workspace 2 | 3 | environment: 4 | sdk: '>=3.0.0 <4.0.0' 5 | 6 | dev_dependencies: 7 | melos: ^6.2.0 8 | --------------------------------------------------------------------------------