├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── community-request-template.md ├── stale.yml └── workflows │ ├── codecov.yml │ └── daily-test.yml ├── .gitignore ├── CHANGELOG.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── NOTICE.txt ├── README.md ├── THIRD-PARTY.txt ├── amazon-chime-sdk ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro ├── src │ ├── androidTest │ │ ├── java │ │ │ └── com │ │ │ │ └── amazonaws │ │ │ │ └── services │ │ │ │ └── chime │ │ │ │ └── sdk │ │ │ │ └── meetings │ │ │ │ ├── audiovideo │ │ │ │ └── video │ │ │ │ │ └── backgroundfilter │ │ │ │ │ └── BackgroundFilterVideoFrameProcessorTest.kt │ │ │ │ └── internal │ │ │ │ └── utils │ │ │ │ └── SQLiteDatabaseManagerIntegrationTests.kt │ │ └── res │ │ │ └── raw │ │ │ ├── background_blurred_image.jpeg │ │ │ ├── background_ml_test_image.jpeg │ │ │ └── background_replaced_image.jpeg │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ │ └── com │ │ │ │ └── amazonaws │ │ │ │ └── services │ │ │ │ └── chime │ │ │ │ └── sdk │ │ │ │ └── meetings │ │ │ │ ├── analytics │ │ │ │ ├── DefaultEventAnalyticsController.kt │ │ │ │ ├── DefaultMeetingStatsCollector.kt │ │ │ │ ├── EventAnalyticsController.kt │ │ │ │ ├── EventAnalyticsFacade.kt │ │ │ │ ├── EventAnalyticsObserver.kt │ │ │ │ ├── EventAttributeName.kt │ │ │ │ ├── EventAttributes.kt │ │ │ │ ├── EventName.kt │ │ │ │ ├── MeetingHistoryEvent.kt │ │ │ │ ├── MeetingHistoryEventName.kt │ │ │ │ └── MeetingStatsCollector.kt │ │ │ │ ├── audiovideo │ │ │ │ ├── AttendeeUpdate.kt │ │ │ │ ├── AudioVideoConfiguration.kt │ │ │ │ ├── AudioVideoControllerFacade.kt │ │ │ │ ├── AudioVideoFacade.kt │ │ │ │ ├── AudioVideoObserver.kt │ │ │ │ ├── DefaultAudioVideoController.kt │ │ │ │ ├── DefaultAudioVideoFacade.kt │ │ │ │ ├── PrimaryMeetingPromotionObserver.kt │ │ │ │ ├── SignalStrength.kt │ │ │ │ ├── Transcript.kt │ │ │ │ ├── VolumeLevel.kt │ │ │ │ ├── audio │ │ │ │ │ ├── AudioDeviceCapabilities.kt │ │ │ │ │ ├── AudioMode.kt │ │ │ │ │ ├── AudioRecordingPresetOverride.kt │ │ │ │ │ ├── AudioStreamType.kt │ │ │ │ │ ├── activespeakerdetector │ │ │ │ │ │ ├── ActiveSpeakerDetectorFacade.kt │ │ │ │ │ │ ├── ActiveSpeakerObserver.kt │ │ │ │ │ │ └── DefaultActiveSpeakerDetector.kt │ │ │ │ │ └── activespeakerpolicy │ │ │ │ │ │ ├── ActiveSpeakerPolicy.kt │ │ │ │ │ │ └── DefaultActiveSpeakerPolicy.kt │ │ │ │ ├── contentshare │ │ │ │ │ ├── ContentShareController.kt │ │ │ │ │ ├── ContentShareObserver.kt │ │ │ │ │ ├── ContentShareSource.kt │ │ │ │ │ ├── ContentShareStatus.kt │ │ │ │ │ ├── ContentShareStatusCode.kt │ │ │ │ │ └── DefaultContentShareController.kt │ │ │ │ ├── metric │ │ │ │ │ ├── MetricsObserver.kt │ │ │ │ │ └── ObservableMetric.kt │ │ │ │ └── video │ │ │ │ │ ├── DefaultVideoRenderView.kt │ │ │ │ │ ├── DefaultVideoTile.kt │ │ │ │ │ ├── DefaultVideoTileController.kt │ │ │ │ │ ├── DefaultVideoTileFactory.kt │ │ │ │ │ ├── LocalVideoConfiguration.kt │ │ │ │ │ ├── RemoteVideoSource.kt │ │ │ │ │ ├── VideoContentHint.kt │ │ │ │ │ ├── VideoFrame.kt │ │ │ │ │ ├── VideoPauseState.kt │ │ │ │ │ ├── VideoPriority.kt │ │ │ │ │ ├── VideoRenderView.kt │ │ │ │ │ ├── VideoResolution.kt │ │ │ │ │ ├── VideoRotation.kt │ │ │ │ │ ├── VideoScalingType.kt │ │ │ │ │ ├── VideoSink.kt │ │ │ │ │ ├── VideoSource.kt │ │ │ │ │ ├── VideoSubscriptionConfiguration.kt │ │ │ │ │ ├── VideoTile.kt │ │ │ │ │ ├── VideoTileController.kt │ │ │ │ │ ├── VideoTileControllerFacade.kt │ │ │ │ │ ├── VideoTileFactory.kt │ │ │ │ │ ├── VideoTileObserver.kt │ │ │ │ │ ├── VideoTileState.kt │ │ │ │ │ ├── backgroundfilter │ │ │ │ │ ├── BackgroundFilterVideoFrameProcessor.kt │ │ │ │ │ ├── ModelShape.kt │ │ │ │ │ ├── SegmentationProcessor.kt │ │ │ │ │ ├── backgroundblur │ │ │ │ │ │ ├── BackgroundBlurConfiguration.kt │ │ │ │ │ │ ├── BackgroundBlurVideoFrameProcessor.kt │ │ │ │ │ │ └── BlurProcessor.kt │ │ │ │ │ └── backgroundreplacement │ │ │ │ │ │ ├── BackgroundReplacementConfiguration.kt │ │ │ │ │ │ └── BackgroundReplacementVideoFrameProcessor.kt │ │ │ │ │ ├── buffer │ │ │ │ │ ├── VideoFrameBuffer.kt │ │ │ │ │ ├── VideoFrameI420Buffer.kt │ │ │ │ │ ├── VideoFrameRGBABuffer.kt │ │ │ │ │ └── VideoFrameTextureBuffer.kt │ │ │ │ │ ├── capture │ │ │ │ │ ├── CameraCaptureSource.kt │ │ │ │ │ ├── CaptureSourceError.kt │ │ │ │ │ ├── CaptureSourceObserver.kt │ │ │ │ │ ├── DefaultCameraCaptureSource.kt │ │ │ │ │ ├── DefaultScreenCaptureSource.kt │ │ │ │ │ ├── DefaultSurfaceTextureCaptureSource.kt │ │ │ │ │ ├── DefaultSurfaceTextureCaptureSourceFactory.kt │ │ │ │ │ ├── ScreenCaptureResolutionCalculator.kt │ │ │ │ │ ├── SurfaceTextureCaptureSource.kt │ │ │ │ │ ├── SurfaceTextureCaptureSourceFactory.kt │ │ │ │ │ ├── VideoCaptureFormat.kt │ │ │ │ │ └── VideoCaptureSource.kt │ │ │ │ │ └── gl │ │ │ │ │ ├── DefaultEglCore.kt │ │ │ │ │ ├── DefaultEglCoreFactory.kt │ │ │ │ │ ├── EglCore.kt │ │ │ │ │ ├── EglCoreFactory.kt │ │ │ │ │ ├── EglVideoRenderView.kt │ │ │ │ │ ├── SurfaceRenderView.kt │ │ │ │ │ └── TextureRenderView.kt │ │ │ │ ├── device │ │ │ │ ├── DefaultDeviceController.kt │ │ │ │ ├── DeviceChangeObserver.kt │ │ │ │ ├── DeviceController.kt │ │ │ │ └── MediaDevice.kt │ │ │ │ ├── ingestion │ │ │ │ ├── DefaultEventReporter.kt │ │ │ │ ├── DefaultEventSender.kt │ │ │ │ ├── DefaultMeetingEventBuffer.kt │ │ │ │ ├── DefaultMeetingEventReporterFactory.kt │ │ │ │ ├── EventBuffer.kt │ │ │ │ ├── EventClientConfiguration.kt │ │ │ │ ├── EventReporter.kt │ │ │ │ ├── EventReporterFactory.kt │ │ │ │ ├── EventSender.kt │ │ │ │ ├── IngestionConfiguration.kt │ │ │ │ ├── IngestionEvent.kt │ │ │ │ ├── IngestionRecord.kt │ │ │ │ ├── MeetingEventClientConfiguration.kt │ │ │ │ └── NoopEventReporterFactory.kt │ │ │ │ ├── internal │ │ │ │ ├── AttendeeStatus.kt │ │ │ │ ├── SessionStateControllerAction.kt │ │ │ │ ├── audio │ │ │ │ │ ├── AudioClientController.kt │ │ │ │ │ ├── AudioClientFactory.kt │ │ │ │ │ ├── AudioClientObserver.kt │ │ │ │ │ ├── AudioClientState.kt │ │ │ │ │ ├── DefaultAudioClientController.kt │ │ │ │ │ └── DefaultAudioClientObserver.kt │ │ │ │ ├── contentshare │ │ │ │ │ ├── ContentShareVideoClientController.kt │ │ │ │ │ ├── ContentShareVideoClientObserver.kt │ │ │ │ │ ├── DefaultContentShareVideoClientController.kt │ │ │ │ │ └── DefaultContentShareVideoClientObserver.kt │ │ │ │ ├── ingestion │ │ │ │ │ ├── DirtyEventDao.kt │ │ │ │ │ ├── DirtyMeetingEventItem.kt │ │ │ │ │ ├── EventDao.kt │ │ │ │ │ ├── EventTypeConverters.kt │ │ │ │ │ ├── IngestionEventConverter.kt │ │ │ │ │ ├── MeetingEventItem.kt │ │ │ │ │ ├── SDKEvent.kt │ │ │ │ │ └── database │ │ │ │ │ │ ├── DatabaseManager.kt │ │ │ │ │ │ ├── DatabaseTable.kt │ │ │ │ │ │ ├── DirtyEventSQLiteDao.kt │ │ │ │ │ │ ├── EventSQLiteDao.kt │ │ │ │ │ │ └── SQLiteDatabaseManager.kt │ │ │ │ ├── metric │ │ │ │ │ ├── ClientMetricsCollector.kt │ │ │ │ │ └── DefaultClientMetricsCollector.kt │ │ │ │ ├── utils │ │ │ │ │ ├── AppInfoUtil.kt │ │ │ │ │ ├── BackOffRetry.kt │ │ │ │ │ ├── ConcurrentSet.kt │ │ │ │ │ ├── DNSServerUtils.kt │ │ │ │ │ ├── DefaultBackOffRetry.kt │ │ │ │ │ ├── DeviceUtils.kt │ │ │ │ │ ├── EventAttributesUtils.kt │ │ │ │ │ ├── HttpException.kt │ │ │ │ │ ├── HttpResponse.kt │ │ │ │ │ ├── HttpUtils.kt │ │ │ │ │ ├── JsonUtils.kt │ │ │ │ │ ├── ObserverUtils.kt │ │ │ │ │ ├── TURNRequestUtils.kt │ │ │ │ │ ├── TimezoneUtils.kt │ │ │ │ │ └── VideoLayoutMeasure.kt │ │ │ │ └── video │ │ │ │ │ ├── DefaultVideoClientController.kt │ │ │ │ │ ├── DefaultVideoClientFactory.kt │ │ │ │ │ ├── DefaultVideoClientObserver.kt │ │ │ │ │ ├── DefaultVideoClientStateController.kt │ │ │ │ │ ├── TURNCredentials.kt │ │ │ │ │ ├── TURNRequestParams.kt │ │ │ │ │ ├── VideoClientController.kt │ │ │ │ │ ├── VideoClientFactory.kt │ │ │ │ │ ├── VideoClientLifecycleHandler.kt │ │ │ │ │ ├── VideoClientObserver.kt │ │ │ │ │ ├── VideoClientState.kt │ │ │ │ │ ├── VideoClientStateController.kt │ │ │ │ │ ├── VideoSourceAdapter.kt │ │ │ │ │ └── gl │ │ │ │ │ ├── DefaultEglRenderer.kt │ │ │ │ │ ├── DefaultGlVideoFrameDrawer.kt │ │ │ │ │ ├── EglRenderer.kt │ │ │ │ │ ├── GlUtil.kt │ │ │ │ │ ├── GlVideoFrameDrawer.kt │ │ │ │ │ └── ShareEglLock.kt │ │ │ │ ├── realtime │ │ │ │ ├── DefaultRealtimeController.kt │ │ │ │ ├── RealtimeControllerFacade.kt │ │ │ │ ├── RealtimeObserver.kt │ │ │ │ ├── TranscriptEventObserver.kt │ │ │ │ └── datamessage │ │ │ │ │ ├── DataMessage.kt │ │ │ │ │ └── DataMessageObserver.kt │ │ │ │ ├── session │ │ │ │ ├── CreateAttendeeResponse.kt │ │ │ │ ├── CreateMeetingResponse.kt │ │ │ │ ├── DefaultMeetingSession.kt │ │ │ │ ├── MeetingSession.kt │ │ │ │ ├── MeetingSessionConfiguration.kt │ │ │ │ ├── MeetingSessionCredentials.kt │ │ │ │ ├── MeetingSessionStatus.kt │ │ │ │ ├── MeetingSessionStatusCode.kt │ │ │ │ ├── MeetingSessionURLs.kt │ │ │ │ └── URLRewriter.kt │ │ │ │ └── utils │ │ │ │ ├── DefaultModality.kt │ │ │ │ ├── GlTextureFrameBufferHelper.kt │ │ │ │ ├── ModalityType.kt │ │ │ │ ├── RefCountDelegate.kt │ │ │ │ ├── Versioning.kt │ │ │ │ └── logger │ │ │ │ ├── ConsoleLogger.kt │ │ │ │ ├── LogLevel.kt │ │ │ │ └── Logger.kt │ │ └── res │ │ │ └── values │ │ │ └── strings.xml │ └── test │ │ └── java │ │ └── com │ │ └── amazonaws │ │ └── services │ │ └── chime │ │ └── sdk │ │ └── meetings │ │ ├── TestConstant.kt │ │ ├── analytics │ │ ├── DefaultEventAnalyticsControllerTest.kt │ │ ├── DefaultMeetingStatsCollectorTest.kt │ │ └── EventAttributesTest.kt │ │ ├── audiovideo │ │ ├── AudioVideoConfigurationTest.kt │ │ ├── DefaultAudioVideoControllerTest.kt │ │ ├── DefaultAudioVideoFacadeTest.kt │ │ ├── audio │ │ │ ├── AudioDeviceCapabilitiesTest.kt │ │ │ ├── AudioModeTest.kt │ │ │ ├── activespeakerdetector │ │ │ │ └── DefaultActiveSpeakerDetectorTest.kt │ │ │ └── activespeakerpolicy │ │ │ │ └── DefaultActiveSpeakerPolicyTest.kt │ │ ├── contentshare │ │ │ └── DefaultContentShareControllerTest.kt │ │ ├── metric │ │ │ └── ObservableMetricTest.kt │ │ └── video │ │ │ ├── DefaultVideoTileControllerTest.kt │ │ │ ├── DefaultVideoTileFactoryTest.kt │ │ │ ├── VideoTileStateTest.kt │ │ │ ├── capture │ │ │ ├── DefaultCameraCaptureSourceTest.kt │ │ │ ├── DefaultScreenCaptureSourceTest.kt │ │ │ ├── DefaultSurfaceTextureCaptureSourceTest.kt │ │ │ └── ScreenCaptureResolutionCalculatorTest.kt │ │ │ └── gl │ │ │ ├── DefaultEglCoreTest.kt │ │ │ └── TextureRenderViewTest.kt │ │ ├── device │ │ ├── DefaultDeviceControllerTest.kt │ │ └── MediaDeviceTest.kt │ │ ├── ingestion │ │ ├── DefaultEventReporterTests.kt │ │ ├── DefaultEventSenderTests.kt │ │ ├── DefaultMeetingEventBufferTests.kt │ │ ├── DefaultMeetingEventReporterFactoryTest.kt │ │ ├── IngestionConfigurationTests.kt │ │ └── IngestionEventTests.kt │ │ ├── internal │ │ ├── AttendeeStatusTest.kt │ │ ├── audio │ │ │ ├── DefaultAudioClientControllerTest.kt │ │ │ └── DefaultAudioClientObserverTest.kt │ │ ├── contentshare │ │ │ └── DefaultContentShareVideoClientControllerTest.kt │ │ ├── ingestion │ │ │ ├── DirtyEventSQLiteDaoTests.kt │ │ │ ├── EventSQLiteDaoTests.kt │ │ │ ├── EventTypeConvertersTests.kt │ │ │ └── IngestionEventConverterTests.kt │ │ ├── metric │ │ │ └── DefaultClientMetricsCollectorTest.kt │ │ ├── utils │ │ │ ├── DeviceUtilsTest.kt │ │ │ ├── HttpUtilsTest.kt │ │ │ ├── ObserverUtilsTest.kt │ │ │ └── TimezoneUtilsTest.kt │ │ └── video │ │ │ ├── DefaultContentShareVideoClientObserverTest.kt │ │ │ ├── DefaultVideoClientControllerTest.kt │ │ │ ├── DefaultVideoClientObserverTest.kt │ │ │ ├── DefaultVideoClientStateControllerTest.kt │ │ │ ├── VideoSourceAdapterTest.kt │ │ │ └── gl │ │ │ ├── DefaultEglCoreFactoryTest.kt │ │ │ └── DefaultGlVideoFrameDrawerTest.kt │ │ ├── realtime │ │ ├── DefaultRealtimeControllerTest.kt │ │ └── datamessage │ │ │ └── DataMessageTest.kt │ │ ├── session │ │ ├── DefaultMeetingSessionTest.kt │ │ ├── MeetingSessionConfigurationJavaTest.java │ │ ├── MeetingSessionConfigurationTest.kt │ │ ├── MeetingSessionStatusCodeTest.kt │ │ └── MeetingSessionStatusTest.kt │ │ └── utils │ │ ├── DefaultModalityTest.kt │ │ ├── RefCountTest.kt │ │ ├── VersioningTest.kt │ │ └── logger │ │ └── ConsoleLoggerTest.kt └── version.properties ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── ic_launcher-playstore.png │ ├── java │ └── com │ │ └── amazonaws │ │ └── services │ │ └── chime │ │ └── sdkdemo │ │ ├── activity │ │ ├── HomeActivity.kt │ │ ├── MeetingActivity.kt │ │ ├── SplashActivity.kt │ │ └── TranscriptionConfigActivity.kt │ │ ├── adapter │ │ ├── CaptionAdapter.kt │ │ ├── DeviceAdapter.kt │ │ ├── LanguageOptionsAdapter.kt │ │ ├── MessageAdapter.kt │ │ ├── MetricAdapter.kt │ │ ├── RosterAdapter.kt │ │ ├── VideoAdapter.kt │ │ └── VideoDiffCallback.kt │ │ ├── data │ │ ├── Caption.kt │ │ ├── JoinMeetingResponse.kt │ │ ├── Message.kt │ │ ├── MetricData.kt │ │ ├── RosterAttendee.kt │ │ ├── TranscriptionConfig.kt │ │ └── VideoCollectionTile.kt │ │ ├── device │ │ ├── AudioDeviceManager.kt │ │ └── ScreenShareManager.kt │ │ ├── fragment │ │ ├── DebugSettingsFragment.kt │ │ ├── DeviceManagementFragment.kt │ │ ├── MeetingFragment.kt │ │ └── TranscriptionConfigFragment.kt │ │ ├── model │ │ ├── DebugSettingsViewModel.kt │ │ ├── MeetingModel.kt │ │ └── MeetingSessionModel.kt │ │ ├── service │ │ ├── MicrophoneService.kt │ │ └── ScreenCaptureService.kt │ │ └── utils │ │ ├── BlackAndWhiteGlVideoFrameDrawer.kt │ │ ├── CpuVideoProcessor.kt │ │ ├── Extensions.kt │ │ ├── GpuVideoProcessor.kt │ │ ├── LogEntry.kt │ │ └── PostLogger.kt │ └── res │ ├── drawable-v24 │ └── ic_launcher_foreground.xml │ ├── drawable │ ├── active_speaker_circle.xml │ ├── button_camera.xml │ ├── button_camera_on.xml │ ├── button_end.xml │ ├── button_more.xml │ ├── button_mute.xml │ ├── button_mute_on.xml │ ├── button_send_message.xml │ ├── button_speaker.xml │ ├── button_switch_camera.xml │ ├── button_up.xml │ ├── ic_camera_disabled.xml │ ├── ic_camera_enabled.xml │ ├── ic_connection_problem.xml │ ├── ic_dial_in.xml │ ├── ic_hang_up.xml │ ├── ic_launcher_background.xml │ ├── ic_microphone_audio_1.xml │ ├── ic_microphone_audio_2.xml │ ├── ic_microphone_audio_3.xml │ ├── ic_microphone_disabled.xml │ ├── ic_microphone_enabled.xml │ ├── ic_microphone_poor_connectivity.xml │ ├── ic_microphone_poor_connectivity_dissabled.xml │ ├── ic_more_horiz.xml │ ├── ic_mute.xml │ ├── ic_mute_on.xml │ ├── ic_pause_video.xml │ ├── ic_resume_video.xml │ ├── ic_sound_enabled.xml │ ├── ic_switch_camera.xml │ ├── ic_up.xml │ └── messages_border.xml │ ├── layout │ ├── activity_home.xml │ ├── activity_meeting.xml │ ├── activity_splash.xml │ ├── activity_transcription_config.xml │ ├── alert_dialog_language_options.xml │ ├── fragment_debug_settings.xml │ ├── fragment_device_management.xml │ ├── fragment_meeting.xml │ ├── fragment_transcription_config.xml │ ├── item_video.xml │ ├── row_caption.xml │ ├── row_language_option.xml │ ├── row_message.xml │ ├── row_metric.xml │ └── row_roster.xml │ ├── menu │ ├── priority_popup_menu.xml │ ├── resolution_popup_menu.xml │ └── video_filter_popup_menu.xml │ ├── mipmap-anydpi-v26 │ ├── ic_launcher.xml │ └── ic_launcher_round.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ ├── ic_launcher_background.png │ ├── ic_launcher_foreground.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── codecov.yml ├── docs ├── amazon-chime-sdk │ ├── com.amazonaws.services.chime.sdk.meetings.analytics │ │ ├── -default-event-analytics-controller │ │ │ ├── -default-event-analytics-controller.html │ │ │ ├── add-event-analytics-observer.html │ │ │ ├── get-common-event-attributes.html │ │ │ ├── get-meeting-history.html │ │ │ ├── index.html │ │ │ ├── publish-event.html │ │ │ ├── push-history.html │ │ │ └── remove-event-analytics-observer.html │ │ ├── -default-meeting-stats-collector │ │ │ ├── -default-meeting-stats-collector.html │ │ │ ├── add-meeting-history-event.html │ │ │ ├── get-meeting-history.html │ │ │ ├── get-meeting-stats-event-attributes.html │ │ │ ├── increment-poor-connection-count.html │ │ │ ├── increment-retry-count.html │ │ │ ├── index.html │ │ │ ├── reset-meeting-stats.html │ │ │ ├── update-max-video-tile.html │ │ │ ├── update-meeting-start-connecting-time-ms.html │ │ │ └── update-meeting-start-time-ms.html │ │ ├── -event-analytics-controller │ │ │ ├── add-event-analytics-observer.html │ │ │ ├── get-common-event-attributes.html │ │ │ ├── get-meeting-history.html │ │ │ ├── index.html │ │ │ ├── publish-event.html │ │ │ ├── push-history.html │ │ │ └── remove-event-analytics-observer.html │ │ ├── -event-analytics-facade │ │ │ ├── add-event-analytics-observer.html │ │ │ ├── get-common-event-attributes.html │ │ │ ├── get-meeting-history.html │ │ │ ├── index.html │ │ │ └── remove-event-analytics-observer.html │ │ ├── -event-analytics-observer │ │ │ ├── index.html │ │ │ └── on-event-received.html │ │ ├── -event-attribute-name │ │ │ ├── attendee-id │ │ │ │ └── index.html │ │ │ ├── device-manufacturer │ │ │ │ └── index.html │ │ │ ├── device-model │ │ │ │ └── index.html │ │ │ ├── device-name │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── external-meeting-id │ │ │ │ └── index.html │ │ │ ├── external-user-id │ │ │ │ └── index.html │ │ │ ├── index.html │ │ │ ├── max-video-tile-count │ │ │ │ └── index.html │ │ │ ├── media-sdk-version │ │ │ │ └── index.html │ │ │ ├── meeting-duration-ms │ │ │ │ └── index.html │ │ │ ├── meeting-error-message │ │ │ │ └── index.html │ │ │ ├── meeting-history │ │ │ │ └── index.html │ │ │ ├── meeting-id │ │ │ │ └── index.html │ │ │ ├── meeting-start-duration-ms │ │ │ │ └── index.html │ │ │ ├── meeting-status │ │ │ │ └── index.html │ │ │ ├── os-name │ │ │ │ └── index.html │ │ │ ├── os-version │ │ │ │ └── index.html │ │ │ ├── poor-connection-count │ │ │ │ └── index.html │ │ │ ├── retry-count │ │ │ │ └── index.html │ │ │ ├── sdk-name │ │ │ │ └── index.html │ │ │ ├── sdk-version │ │ │ │ └── index.html │ │ │ ├── timestamp-ms │ │ │ │ └── index.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ └── video-input-error │ │ │ │ └── index.html │ │ ├── -event-attributes │ │ │ └── index.html │ │ ├── -event-name │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── meeting-ended │ │ │ │ └── index.html │ │ │ ├── meeting-failed │ │ │ │ └── index.html │ │ │ ├── meeting-start-failed │ │ │ │ └── index.html │ │ │ ├── meeting-start-requested │ │ │ │ └── index.html │ │ │ ├── meeting-start-succeeded │ │ │ │ └── index.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ └── video-input-failed │ │ │ │ └── index.html │ │ ├── -meeting-history-event-name │ │ │ ├── -companion │ │ │ │ ├── from-meeting-event.html │ │ │ │ └── index.html │ │ │ ├── audio-input-selected │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── meeting-ended │ │ │ │ └── index.html │ │ │ ├── meeting-failed │ │ │ │ └── index.html │ │ │ ├── meeting-reconnected │ │ │ │ └── index.html │ │ │ ├── meeting-start-failed │ │ │ │ └── index.html │ │ │ ├── meeting-start-requested │ │ │ │ └── index.html │ │ │ ├── meeting-start-succeeded │ │ │ │ └── index.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ ├── video-input-failed │ │ │ │ └── index.html │ │ │ └── video-input-selected │ │ │ │ └── index.html │ │ ├── -meeting-history-event │ │ │ ├── -meeting-history-event.html │ │ │ ├── index.html │ │ │ ├── meeting-history-event-name.html │ │ │ └── timestamp.html │ │ ├── -meeting-stats-collector │ │ │ ├── add-meeting-history-event.html │ │ │ ├── get-meeting-history.html │ │ │ ├── get-meeting-stats-event-attributes.html │ │ │ ├── increment-poor-connection-count.html │ │ │ ├── increment-retry-count.html │ │ │ ├── index.html │ │ │ ├── reset-meeting-stats.html │ │ │ ├── update-max-video-tile.html │ │ │ ├── update-meeting-start-connecting-time-ms.html │ │ │ └── update-meeting-start-time-ms.html │ │ ├── index.html │ │ ├── to-json-string.html │ │ └── to-string-key-map.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerdetector │ │ ├── -active-speaker-detector-facade │ │ │ ├── add-active-speaker-observer.html │ │ │ ├── index.html │ │ │ └── remove-active-speaker-observer.html │ │ ├── -active-speaker-observer │ │ │ ├── index.html │ │ │ ├── on-active-speaker-detected.html │ │ │ ├── on-active-speaker-score-changed.html │ │ │ └── score-callback-interval-ms.html │ │ ├── -default-active-speaker-detector │ │ │ ├── -default-active-speaker-detector.html │ │ │ ├── add-active-speaker-observer.html │ │ │ ├── audio-client-observer.html │ │ │ ├── index.html │ │ │ ├── on-attendees-dropped.html │ │ │ ├── on-attendees-joined.html │ │ │ ├── on-attendees-left.html │ │ │ ├── on-attendees-muted.html │ │ │ ├── on-attendees-unmuted.html │ │ │ ├── on-signal-strength-changed.html │ │ │ ├── on-volume-changed.html │ │ │ └── remove-active-speaker-observer.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerpolicy │ │ ├── -active-speaker-policy │ │ │ ├── calculate-score.html │ │ │ └── index.html │ │ ├── -default-active-speaker-policy │ │ │ ├── -default-active-speaker-policy.html │ │ │ ├── calculate-score.html │ │ │ └── index.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.audio │ │ ├── -audio-device-capabilities │ │ │ ├── -input-and-output │ │ │ │ └── index.html │ │ │ ├── -none │ │ │ │ └── index.html │ │ │ ├── -output-only │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── required-permissions.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -audio-mode │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -mono16-k │ │ │ │ └── index.html │ │ │ ├── -mono48-k │ │ │ │ └── index.html │ │ │ ├── -stereo48-k │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -audio-recording-preset-override │ │ │ ├── -camcorder │ │ │ │ └── index.html │ │ │ ├── -generic │ │ │ │ └── index.html │ │ │ ├── -none │ │ │ │ └── index.html │ │ │ ├── -voice-communication │ │ │ │ └── index.html │ │ │ ├── -voice-recognition │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -audio-stream-type │ │ │ ├── -music │ │ │ │ └── index.html │ │ │ ├── -voice-call │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare │ │ ├── -content-share-controller │ │ │ ├── add-content-share-observer.html │ │ │ ├── index.html │ │ │ ├── remove-content-share-observer.html │ │ │ ├── start-content-share.html │ │ │ └── stop-content-share.html │ │ ├── -content-share-observer │ │ │ ├── index.html │ │ │ ├── on-content-share-started.html │ │ │ └── on-content-share-stopped.html │ │ ├── -content-share-source │ │ │ ├── -content-share-source.html │ │ │ ├── index.html │ │ │ └── video-source.html │ │ ├── -content-share-status-code │ │ │ ├── -o-k │ │ │ │ └── index.html │ │ │ ├── -video-service-failed │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -content-share-status │ │ │ ├── -content-share-status.html │ │ │ ├── index.html │ │ │ └── status-code.html │ │ ├── -default-content-share-controller │ │ │ ├── -default-content-share-controller.html │ │ │ ├── add-content-share-observer.html │ │ │ ├── index.html │ │ │ ├── remove-content-share-observer.html │ │ │ ├── start-content-share.html │ │ │ └── stop-content-share.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.metric │ │ ├── -metrics-observer │ │ │ ├── index.html │ │ │ └── on-metrics-received.html │ │ ├── -observable-metric │ │ │ ├── audio-receive-packet-loss-percent │ │ │ │ └── index.html │ │ │ ├── audio-send-packet-loss-percent │ │ │ │ └── index.html │ │ │ ├── content-share-video-send-bitrate │ │ │ │ └── index.html │ │ │ ├── content-share-video-send-fps │ │ │ │ └── index.html │ │ │ ├── content-share-video-send-packet-loss-percent │ │ │ │ └── index.html │ │ │ ├── content-share-video-send-rtt-ms │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── is-content-share-metric.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ ├── video-available-receive-bandwidth │ │ │ │ └── index.html │ │ │ ├── video-available-send-bandwidth │ │ │ │ └── index.html │ │ │ ├── video-receive-bitrate │ │ │ │ └── index.html │ │ │ ├── video-receive-packet-loss-percent │ │ │ │ └── index.html │ │ │ ├── video-send-bitrate │ │ │ │ └── index.html │ │ │ ├── video-send-fps │ │ │ │ └── index.html │ │ │ ├── video-send-packet-loss-percent │ │ │ │ └── index.html │ │ │ └── video-send-rtt-ms │ │ │ │ └── index.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter.backgroundblur │ │ ├── -background-blur-configuration │ │ │ ├── -background-blur-configuration.html │ │ │ ├── blur-strength.html │ │ │ └── index.html │ │ ├── -background-blur-video-frame-processor │ │ │ ├── -background-blur-video-frame-processor.html │ │ │ ├── add-video-sink.html │ │ │ ├── configurations.html │ │ │ ├── content-hint.html │ │ │ ├── get-background-blurred-bitmap.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ └── remove-video-sink.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter.backgroundreplacement │ │ ├── -background-replacement-configuration │ │ │ ├── -background-replacement-configuration.html │ │ │ ├── image.html │ │ │ └── index.html │ │ ├── -background-replacement-video-frame-processor │ │ │ ├── -background-replacement-video-frame-processor.html │ │ │ ├── add-video-sink.html │ │ │ ├── configurations.html │ │ │ ├── content-hint.html │ │ │ ├── get-background-replaced-bitmap.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ └── remove-video-sink.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter │ │ ├── -background-filter-video-frame-processor │ │ │ ├── -background-filter-video-frame-processor.html │ │ │ ├── draw-image-with-mask.html │ │ │ ├── get-byte-buffer-from-input-video-frame.html │ │ │ ├── get-input-bitmap.html │ │ │ ├── get-processed-frame.html │ │ │ ├── get-scaled-input-bitmap.html │ │ │ ├── get-segmentation-mask.html │ │ │ ├── index.html │ │ │ └── release.html │ │ ├── -model-shape │ │ │ ├── -model-shape.html │ │ │ ├── channels.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── model-range-max.html │ │ │ ├── model-range-min.html │ │ │ └── width.html │ │ ├── -segmentation-processor │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ └── is-machine-learning-library-loaded.html │ │ │ ├── -segmentation-processor.html │ │ │ ├── context.html │ │ │ ├── get-input-buffer.html │ │ │ ├── get-output-buffer.html │ │ │ ├── index.html │ │ │ ├── initialize.html │ │ │ ├── model-state.html │ │ │ └── predict.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.buffer │ │ ├── -video-frame-buffer │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── retain.html │ │ │ └── width.html │ │ ├── -video-frame-i420-buffer │ │ │ ├── -video-frame-i420-buffer.html │ │ │ ├── data-u.html │ │ │ ├── data-v.html │ │ │ ├── data-y.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── retain.html │ │ │ ├── stride-u.html │ │ │ ├── stride-v.html │ │ │ ├── stride-y.html │ │ │ └── width.html │ │ ├── -video-frame-r-g-b-a-buffer │ │ │ ├── -video-frame-r-g-b-a-buffer.html │ │ │ ├── data.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── retain.html │ │ │ ├── stride.html │ │ │ └── width.html │ │ ├── -video-frame-texture-buffer │ │ │ ├── -type │ │ │ │ ├── -t-e-x-t-u-r-e_-o-e-s │ │ │ │ │ └── index.html │ │ │ │ ├── -t-e-x-t-u-r-e_2-d │ │ │ │ │ └── index.html │ │ │ │ ├── entries.html │ │ │ │ ├── index.html │ │ │ │ ├── value-of.html │ │ │ │ └── values.html │ │ │ ├── -video-frame-texture-buffer.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── retain.html │ │ │ ├── texture-id.html │ │ │ ├── transform-matrix.html │ │ │ ├── type.html │ │ │ └── width.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture │ │ ├── -camera-capture-source │ │ │ ├── device.html │ │ │ ├── format.html │ │ │ ├── index.html │ │ │ ├── switch-camera.html │ │ │ └── torch-enabled.html │ │ ├── -capture-source-error │ │ │ ├── -configuration-failure │ │ │ │ └── index.html │ │ │ ├── -permission-error │ │ │ │ └── index.html │ │ │ ├── -system-failure │ │ │ │ └── index.html │ │ │ ├── -unknown │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -capture-source-observer │ │ │ ├── index.html │ │ │ ├── on-capture-failed.html │ │ │ ├── on-capture-started.html │ │ │ └── on-capture-stopped.html │ │ ├── -default-camera-capture-source │ │ │ ├── -default-camera-capture-source.html │ │ │ ├── add-capture-source-observer.html │ │ │ ├── add-video-sink.html │ │ │ ├── content-hint.html │ │ │ ├── device.html │ │ │ ├── event-analytics-controller.html │ │ │ ├── format.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ ├── remove-capture-source-observer.html │ │ │ ├── remove-video-sink.html │ │ │ ├── set-max-resolution.html │ │ │ ├── start.html │ │ │ ├── stop.html │ │ │ ├── switch-camera.html │ │ │ └── torch-enabled.html │ │ ├── -default-screen-capture-source │ │ │ ├── -default-screen-capture-source.html │ │ │ ├── add-capture-source-observer.html │ │ │ ├── add-video-sink.html │ │ │ ├── content-hint.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ ├── remove-capture-source-observer.html │ │ │ ├── remove-video-sink.html │ │ │ ├── set-max-resolution.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ ├── -default-surface-texture-capture-source-factory │ │ │ ├── -default-surface-texture-capture-source-factory.html │ │ │ ├── create-surface-texture-capture-source.html │ │ │ └── index.html │ │ ├── -default-surface-texture-capture-source │ │ │ ├── -default-surface-texture-capture-source.html │ │ │ ├── add-capture-source-observer.html │ │ │ ├── add-video-sink.html │ │ │ ├── content-hint.html │ │ │ ├── index.html │ │ │ ├── min-fps.html │ │ │ ├── release.html │ │ │ ├── remove-capture-source-observer.html │ │ │ ├── remove-video-sink.html │ │ │ ├── set-max-resolution.html │ │ │ ├── start.html │ │ │ ├── stop.html │ │ │ └── surface.html │ │ ├── -screen-capture-resolution-calculator │ │ │ ├── -screen-capture-resolution-calculator.html │ │ │ ├── align-to-even.html │ │ │ ├── compute-target-size.html │ │ │ └── index.html │ │ ├── -surface-texture-capture-source-factory │ │ │ ├── create-surface-texture-capture-source.html │ │ │ └── index.html │ │ ├── -surface-texture-capture-source │ │ │ ├── index.html │ │ │ ├── min-fps.html │ │ │ ├── release.html │ │ │ └── surface.html │ │ ├── -video-capture-format │ │ │ ├── -video-capture-format.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── max-fps.html │ │ │ ├── to-string.html │ │ │ └── width.html │ │ ├── -video-capture-source │ │ │ ├── add-capture-source-observer.html │ │ │ ├── index.html │ │ │ ├── remove-capture-source-observer.html │ │ │ ├── set-max-resolution.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl │ │ ├── -default-egl-core-factory │ │ │ ├── -default-egl-core-factory.html │ │ │ ├── create-egl-core.html │ │ │ └── index.html │ │ ├── -default-egl-core │ │ │ ├── -default-egl-core.html │ │ │ ├── egl-config.html │ │ │ ├── egl-context.html │ │ │ ├── egl-display.html │ │ │ ├── egl-surface.html │ │ │ ├── index.html │ │ │ └── release.html │ │ ├── -egl-core-factory │ │ │ ├── create-egl-core.html │ │ │ └── index.html │ │ ├── -egl-core │ │ │ ├── egl-config.html │ │ │ ├── egl-context.html │ │ │ ├── egl-display.html │ │ │ ├── egl-surface.html │ │ │ ├── index.html │ │ │ └── release.html │ │ ├── -egl-video-render-view │ │ │ ├── index.html │ │ │ ├── init.html │ │ │ └── release.html │ │ ├── -surface-render-view │ │ │ ├── -surface-render-view.html │ │ │ ├── hardware-scaling.html │ │ │ ├── index.html │ │ │ ├── init.html │ │ │ ├── logger.html │ │ │ ├── mirror.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ ├── scaling-type.html │ │ │ ├── surface-changed.html │ │ │ ├── surface-created.html │ │ │ └── surface-destroyed.html │ │ ├── -texture-render-view │ │ │ ├── -texture-render-view.html │ │ │ ├── index.html │ │ │ ├── init.html │ │ │ ├── logger.html │ │ │ ├── mirror.html │ │ │ ├── on-surface-texture-available.html │ │ │ ├── on-surface-texture-destroyed.html │ │ │ ├── on-surface-texture-size-changed.html │ │ │ ├── on-surface-texture-updated.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release.html │ │ │ └── scaling-type.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo.video │ │ ├── -default-video-render-view │ │ │ ├── -default-video-render-view.html │ │ │ └── index.html │ │ ├── -default-video-tile-controller │ │ │ ├── -default-video-tile-controller.html │ │ │ ├── add-video-tile-observer.html │ │ │ ├── bind-video-view.html │ │ │ ├── index.html │ │ │ ├── on-receive-frame.html │ │ │ ├── pause-remote-video-tile.html │ │ │ ├── remove-video-tile-observer.html │ │ │ ├── resume-remote-video-tile.html │ │ │ └── unbind-video-view.html │ │ ├── -default-video-tile-factory │ │ │ ├── -default-video-tile-factory.html │ │ │ ├── index.html │ │ │ └── make-tile.html │ │ ├── -default-video-tile │ │ │ ├── -default-video-tile.html │ │ │ ├── bind.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── set-pause-state.html │ │ │ ├── state.html │ │ │ ├── unbind.html │ │ │ └── video-render-view.html │ │ ├── -local-video-configuration │ │ │ ├── -local-video-configuration.html │ │ │ ├── index.html │ │ │ └── safe-max-bit-rate-kbps.html │ │ ├── -remote-video-source │ │ │ ├── -remote-video-source.html │ │ │ ├── attendee-id.html │ │ │ └── index.html │ │ ├── -video-content-hint │ │ │ ├── -detail │ │ │ │ └── index.html │ │ │ ├── -motion │ │ │ │ └── index.html │ │ │ ├── -none │ │ │ │ └── index.html │ │ │ ├── -text │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -video-frame │ │ │ ├── -video-frame.html │ │ │ ├── buffer.html │ │ │ ├── get-rotated-height.html │ │ │ ├── get-rotated-width.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── retain.html │ │ │ ├── rotation.html │ │ │ ├── timestamp-ns.html │ │ │ └── width.html │ │ ├── -video-pause-state │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -paused-by-user-request │ │ │ │ └── index.html │ │ │ ├── -paused-for-poor-connection │ │ │ │ └── index.html │ │ │ ├── -unpaused │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -video-priority │ │ │ ├── -high │ │ │ │ └── index.html │ │ │ ├── -highest │ │ │ │ └── index.html │ │ │ ├── -low │ │ │ │ └── index.html │ │ │ ├── -lowest │ │ │ │ └── index.html │ │ │ ├── -medium │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -video-render-view │ │ │ └── index.html │ │ ├── -video-resolution │ │ │ ├── -disabled │ │ │ │ └── index.html │ │ │ ├── -high │ │ │ │ └── index.html │ │ │ ├── -low │ │ │ │ └── index.html │ │ │ ├── -medium │ │ │ │ └── index.html │ │ │ ├── -video-resolution-f-h-d │ │ │ │ └── index.html │ │ │ ├── -video-resolution-h-d │ │ │ │ └── index.html │ │ │ ├── -video-resolution-u-h-d │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ └── width.html │ │ ├── -video-rotation │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -rotation0 │ │ │ │ └── index.html │ │ │ ├── -rotation180 │ │ │ │ └── index.html │ │ │ ├── -rotation270 │ │ │ │ └── index.html │ │ │ ├── -rotation90 │ │ │ │ └── index.html │ │ │ ├── degrees.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -video-scaling-type │ │ │ ├── -aspect-balanced │ │ │ │ └── index.html │ │ │ ├── -aspect-fill │ │ │ │ └── index.html │ │ │ ├── -aspect-fit │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── values.html │ │ │ └── visible-fraction.html │ │ ├── -video-sink │ │ │ ├── index.html │ │ │ └── on-video-frame-received.html │ │ ├── -video-source │ │ │ ├── add-video-sink.html │ │ │ ├── content-hint.html │ │ │ ├── index.html │ │ │ └── remove-video-sink.html │ │ ├── -video-subscription-configuration │ │ │ ├── -video-subscription-configuration.html │ │ │ ├── index.html │ │ │ ├── priority.html │ │ │ └── target-resolution.html │ │ ├── -video-tile-controller-facade │ │ │ ├── add-video-tile-observer.html │ │ │ ├── bind-video-view.html │ │ │ ├── index.html │ │ │ ├── pause-remote-video-tile.html │ │ │ ├── remove-video-tile-observer.html │ │ │ ├── resume-remote-video-tile.html │ │ │ └── unbind-video-view.html │ │ ├── -video-tile-controller │ │ │ ├── index.html │ │ │ └── on-receive-frame.html │ │ ├── -video-tile-factory │ │ │ ├── index.html │ │ │ └── make-tile.html │ │ ├── -video-tile-observer │ │ │ ├── index.html │ │ │ ├── on-video-tile-added.html │ │ │ ├── on-video-tile-paused.html │ │ │ ├── on-video-tile-removed.html │ │ │ ├── on-video-tile-resumed.html │ │ │ └── on-video-tile-size-changed.html │ │ ├── -video-tile-state │ │ │ ├── -video-tile-state.html │ │ │ ├── attendee-id.html │ │ │ ├── index.html │ │ │ ├── is-content.html │ │ │ ├── is-local-tile.html │ │ │ ├── pause-state.html │ │ │ ├── tile-id.html │ │ │ ├── video-stream-content-height.html │ │ │ └── video-stream-content-width.html │ │ ├── -video-tile │ │ │ ├── bind.html │ │ │ ├── index.html │ │ │ ├── set-pause-state.html │ │ │ ├── state.html │ │ │ ├── unbind.html │ │ │ └── video-render-view.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.audiovideo │ │ ├── -attendee-info │ │ │ ├── -attendee-info.html │ │ │ ├── attendee-id.html │ │ │ ├── external-user-id.html │ │ │ └── index.html │ │ ├── -audio-video-configuration │ │ │ ├── -audio-video-configuration.html │ │ │ ├── audio-device-capabilities.html │ │ │ ├── audio-mode.html │ │ │ ├── audio-recording-preset-override.html │ │ │ ├── audio-stream-type.html │ │ │ ├── enable-audio-redundancy.html │ │ │ ├── index.html │ │ │ └── reconnect-timeout-ms.html │ │ ├── -audio-video-controller-facade │ │ │ ├── add-audio-video-observer.html │ │ │ ├── add-metrics-observer.html │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── index.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── remove-audio-video-observer.html │ │ │ ├── remove-metrics-observer.html │ │ │ ├── start-local-video.html │ │ │ ├── start-remote-video.html │ │ │ ├── start.html │ │ │ ├── stop-local-video.html │ │ │ ├── stop-remote-video.html │ │ │ ├── stop.html │ │ │ └── update-video-source-subscriptions.html │ │ ├── -audio-video-facade │ │ │ └── index.html │ │ ├── -audio-video-observer │ │ │ ├── index.html │ │ │ ├── on-audio-session-cancelled-reconnect.html │ │ │ ├── on-audio-session-dropped.html │ │ │ ├── on-audio-session-started-connecting.html │ │ │ ├── on-audio-session-started.html │ │ │ ├── on-audio-session-stopped.html │ │ │ ├── on-camera-send-availability-updated.html │ │ │ ├── on-connection-became-poor.html │ │ │ ├── on-connection-recovered.html │ │ │ ├── on-remote-video-source-available.html │ │ │ ├── on-remote-video-source-unavailable.html │ │ │ ├── on-video-session-started-connecting.html │ │ │ ├── on-video-session-started.html │ │ │ └── on-video-session-stopped.html │ │ ├── -default-audio-video-controller │ │ │ ├── -companion │ │ │ │ └── index.html │ │ │ ├── -default-audio-video-controller.html │ │ │ ├── add-audio-video-observer.html │ │ │ ├── add-metrics-observer.html │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── index.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── remove-audio-video-observer.html │ │ │ ├── remove-metrics-observer.html │ │ │ ├── start-local-video.html │ │ │ ├── start-remote-video.html │ │ │ ├── start.html │ │ │ ├── stop-local-video.html │ │ │ ├── stop-remote-video.html │ │ │ ├── stop.html │ │ │ └── update-video-source-subscriptions.html │ │ ├── -default-audio-video-facade │ │ │ ├── -default-audio-video-facade.html │ │ │ ├── add-active-speaker-observer.html │ │ │ ├── add-audio-video-observer.html │ │ │ ├── add-content-share-observer.html │ │ │ ├── add-device-change-observer.html │ │ │ ├── add-event-analytics-observer.html │ │ │ ├── add-metrics-observer.html │ │ │ ├── add-realtime-data-message-observer.html │ │ │ ├── add-realtime-observer.html │ │ │ ├── add-realtime-transcript-event-observer.html │ │ │ ├── add-video-tile-observer.html │ │ │ ├── bind-video-view.html │ │ │ ├── choose-audio-device.html │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── get-active-audio-device.html │ │ │ ├── get-active-camera.html │ │ │ ├── get-common-event-attributes.html │ │ │ ├── get-meeting-history.html │ │ │ ├── index.html │ │ │ ├── list-audio-devices.html │ │ │ ├── pause-remote-video-tile.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── realtime-is-voice-focus-enabled.html │ │ │ ├── realtime-local-mute.html │ │ │ ├── realtime-local-unmute.html │ │ │ ├── realtime-send-data-message.html │ │ │ ├── realtime-set-voice-focus-enabled.html │ │ │ ├── remove-active-speaker-observer.html │ │ │ ├── remove-audio-video-observer.html │ │ │ ├── remove-content-share-observer.html │ │ │ ├── remove-device-change-observer.html │ │ │ ├── remove-event-analytics-observer.html │ │ │ ├── remove-metrics-observer.html │ │ │ ├── remove-realtime-data-message-observer-from-topic.html │ │ │ ├── remove-realtime-observer.html │ │ │ ├── remove-realtime-transcript-event-observer.html │ │ │ ├── remove-video-tile-observer.html │ │ │ ├── resume-remote-video-tile.html │ │ │ ├── start-content-share.html │ │ │ ├── start-local-video.html │ │ │ ├── start-remote-video.html │ │ │ ├── start.html │ │ │ ├── stop-content-share.html │ │ │ ├── stop-local-video.html │ │ │ ├── stop-remote-video.html │ │ │ ├── stop.html │ │ │ ├── switch-camera.html │ │ │ ├── unbind-video-view.html │ │ │ └── update-video-source-subscriptions.html │ │ ├── -primary-meeting-promotion-observer │ │ │ ├── index.html │ │ │ ├── on-primary-meeting-demotion.html │ │ │ └── on-primary-meeting-promotion.html │ │ ├── -signal-strength │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -high │ │ │ │ └── index.html │ │ │ ├── -low │ │ │ │ └── index.html │ │ │ ├── -none │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -signal-update │ │ │ ├── -signal-update.html │ │ │ ├── attendee-info.html │ │ │ ├── index.html │ │ │ └── signal-strength.html │ │ ├── -transcript-alternative │ │ │ ├── -transcript-alternative.html │ │ │ ├── entities.html │ │ │ ├── equals.html │ │ │ ├── hash-code.html │ │ │ ├── index.html │ │ │ ├── items.html │ │ │ └── transcript.html │ │ ├── -transcript-entity │ │ │ ├── -transcript-entity.html │ │ │ ├── category.html │ │ │ ├── confidence.html │ │ │ ├── content.html │ │ │ ├── end-time-ms.html │ │ │ ├── index.html │ │ │ ├── start-time-ms.html │ │ │ └── type.html │ │ ├── -transcript-event │ │ │ └── index.html │ │ ├── -transcript-item-type │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -pronunciation │ │ │ │ └── index.html │ │ │ ├── -punctuation │ │ │ │ └── index.html │ │ │ ├── -unknown │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -transcript-item │ │ │ ├── -transcript-item.html │ │ │ ├── attendee.html │ │ │ ├── confidence.html │ │ │ ├── content.html │ │ │ ├── end-time-ms.html │ │ │ ├── index.html │ │ │ ├── stable.html │ │ │ ├── start-time-ms.html │ │ │ ├── type.html │ │ │ └── vocabulary-filter-match.html │ │ ├── -transcript-language-with-score │ │ │ ├── -transcript-language-with-score.html │ │ │ ├── index.html │ │ │ ├── language-code.html │ │ │ └── score.html │ │ ├── -transcript-result │ │ │ ├── -transcript-result.html │ │ │ ├── alternatives.html │ │ │ ├── channel-id.html │ │ │ ├── end-time-ms.html │ │ │ ├── equals.html │ │ │ ├── hash-code.html │ │ │ ├── index.html │ │ │ ├── is-partial.html │ │ │ ├── language-code.html │ │ │ ├── language-identification.html │ │ │ ├── result-id.html │ │ │ └── start-time-ms.html │ │ ├── -transcript │ │ │ ├── -transcript.html │ │ │ ├── equals.html │ │ │ ├── hash-code.html │ │ │ ├── index.html │ │ │ └── results.html │ │ ├── -transcription-status-type │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -failed │ │ │ │ └── index.html │ │ │ ├── -interrupted │ │ │ │ └── index.html │ │ │ ├── -resumed │ │ │ │ └── index.html │ │ │ ├── -started │ │ │ │ └── index.html │ │ │ ├── -stopped │ │ │ │ └── index.html │ │ │ ├── -unknown │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -transcription-status │ │ │ ├── -transcription-status.html │ │ │ ├── event-time-ms.html │ │ │ ├── index.html │ │ │ ├── message.html │ │ │ ├── transcription-configuration.html │ │ │ ├── transcription-region.html │ │ │ └── type.html │ │ ├── -volume-level │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -high │ │ │ │ └── index.html │ │ │ ├── -low │ │ │ │ └── index.html │ │ │ ├── -medium │ │ │ │ └── index.html │ │ │ ├── -muted │ │ │ │ └── index.html │ │ │ ├── -not-speaking │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -volume-update │ │ │ ├── -volume-update.html │ │ │ ├── attendee-info.html │ │ │ ├── index.html │ │ │ └── volume-level.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.device │ │ ├── -default-device-controller │ │ │ ├── -default-device-controller.html │ │ │ ├── add-device-change-observer.html │ │ │ ├── choose-audio-device.html │ │ │ ├── get-active-audio-device.html │ │ │ ├── get-active-camera.html │ │ │ ├── index.html │ │ │ ├── list-audio-devices.html │ │ │ ├── notify-audio-device-change.html │ │ │ ├── remove-device-change-observer.html │ │ │ └── switch-camera.html │ │ ├── -device-change-observer │ │ │ ├── index.html │ │ │ └── on-audio-device-changed.html │ │ ├── -device-controller │ │ │ ├── add-device-change-observer.html │ │ │ ├── choose-audio-device.html │ │ │ ├── get-active-audio-device.html │ │ │ ├── get-active-camera.html │ │ │ ├── index.html │ │ │ ├── list-audio-devices.html │ │ │ ├── remove-device-change-observer.html │ │ │ └── switch-camera.html │ │ ├── -media-device-type │ │ │ ├── -a-u-d-i-o_-b-l-u-e-t-o-o-t-h │ │ │ │ └── index.html │ │ │ ├── -a-u-d-i-o_-b-u-i-l-t-i-n_-s-p-e-a-k-e-r │ │ │ │ └── index.html │ │ │ ├── -a-u-d-i-o_-h-a-n-d-s-e-t │ │ │ │ └── index.html │ │ │ ├── -a-u-d-i-o_-u-s-b_-h-e-a-d-s-e-t │ │ │ │ └── index.html │ │ │ ├── -a-u-d-i-o_-w-i-r-e-d_-h-e-a-d-s-e-t │ │ │ │ └── index.html │ │ │ ├── -companion │ │ │ │ ├── from-audio-device-info.html │ │ │ │ ├── from-camera-metadata.html │ │ │ │ └── index.html │ │ │ ├── -o-t-h-e-r │ │ │ │ └── index.html │ │ │ ├── -v-i-d-e-o_-b-a-c-k_-c-a-m-e-r-a │ │ │ │ └── index.html │ │ │ ├── -v-i-d-e-o_-e-x-t-e-r-n-a-l_-c-a-m-e-r-a │ │ │ │ └── index.html │ │ │ ├── -v-i-d-e-o_-f-r-o-n-t_-c-a-m-e-r-a │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── to-string.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -media-device │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ ├── list-supported-video-capture-formats.html │ │ │ │ └── list-video-devices.html │ │ │ ├── -media-device.html │ │ │ ├── id.html │ │ │ ├── index.html │ │ │ ├── label.html │ │ │ ├── order.html │ │ │ ├── to-string.html │ │ │ └── type.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.ingestion │ │ ├── -default-event-reporter │ │ │ ├── -default-event-reporter.html │ │ │ ├── index.html │ │ │ ├── report.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ ├── -default-event-sender │ │ │ ├── -default-event-sender.html │ │ │ ├── index.html │ │ │ └── send-record.html │ │ ├── -default-meeting-event-buffer │ │ │ ├── -default-meeting-event-buffer.html │ │ │ ├── add.html │ │ │ ├── index.html │ │ │ └── process.html │ │ ├── -default-meeting-event-reporter-factory │ │ │ ├── -default-meeting-event-reporter-factory.html │ │ │ ├── create-event-reporter.html │ │ │ └── index.html │ │ ├── -event-buffer │ │ │ ├── add.html │ │ │ ├── index.html │ │ │ └── process.html │ │ ├── -event-client-configuration │ │ │ ├── event-client-join-token.html │ │ │ ├── index.html │ │ │ ├── metadata-attributes.html │ │ │ ├── tag.html │ │ │ └── type.html │ │ ├── -event-client-type │ │ │ ├── -meet │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -event-reporter-factory │ │ │ ├── create-event-reporter.html │ │ │ └── index.html │ │ ├── -event-reporter │ │ │ ├── index.html │ │ │ ├── report.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ ├── -event-sender │ │ │ ├── index.html │ │ │ └── send-record.html │ │ ├── -f-l-u-s-h_-i-n-t-e-r-v-a-l_-l-i-m-i-t_-m-i-n-i-m-u-m.html │ │ ├── -f-l-u-s-h_-s-i-z-e_-l-i-m-i-t_-m-a-x-i-m-u-m.html │ │ ├── -ingestion-configuration │ │ │ ├── -ingestion-configuration.html │ │ │ ├── client-configuration.html │ │ │ ├── disabled.html │ │ │ ├── flush-interval-ms.html │ │ │ ├── flush-size.html │ │ │ ├── index.html │ │ │ ├── ingestion-url.html │ │ │ └── retry-count-limit.html │ │ ├── -ingestion-event │ │ │ ├── -ingestion-event.html │ │ │ ├── index.html │ │ │ ├── metadata.html │ │ │ ├── payloads.html │ │ │ ├── type.html │ │ │ └── version.html │ │ ├── -ingestion-metadata │ │ │ └── index.html │ │ ├── -ingestion-payload │ │ │ └── index.html │ │ ├── -ingestion-record │ │ │ ├── -ingestion-record.html │ │ │ ├── events.html │ │ │ ├── index.html │ │ │ └── metadata.html │ │ ├── -meeting-event-client-configuration │ │ │ ├── -meeting-event-client-configuration.html │ │ │ ├── attendee-id.html │ │ │ ├── event-client-join-token.html │ │ │ ├── index.html │ │ │ ├── meeting-id.html │ │ │ ├── metadata-attributes.html │ │ │ ├── tag.html │ │ │ └── type.html │ │ ├── -noop-event-reporter-factory │ │ │ ├── -noop-event-reporter-factory.html │ │ │ ├── create-event-reporter.html │ │ │ └── index.html │ │ ├── -r-e-t-r-y_-c-o-u-n-t_-l-i-m-i-t_-m-a-x-i-m-u-m.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.audio │ │ ├── -audio-client-controller │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── get-route.html │ │ │ ├── index.html │ │ │ ├── is-voice-focus-enabled.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── set-mute.html │ │ │ ├── set-route.html │ │ │ ├── set-voice-focus-enabled.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ ├── -audio-client-factory │ │ │ ├── -companion │ │ │ │ ├── get-audio-client.html │ │ │ │ └── index.html │ │ │ └── index.html │ │ ├── -audio-client-observer │ │ │ ├── current-audio-status.html │ │ │ ├── index.html │ │ │ ├── notify-audio-client-observer.html │ │ │ ├── primary-meeting-promotion-observer.html │ │ │ ├── subscribe-to-audio-client-state-change.html │ │ │ ├── subscribe-to-real-time-events.html │ │ │ ├── subscribe-to-transcript-event.html │ │ │ ├── unsubscribe-from-audio-client-state-change.html │ │ │ ├── unsubscribe-from-real-time-events.html │ │ │ └── unsubscribe-from-transcript-event.html │ │ ├── -audio-client-state │ │ │ ├── -i-n-i-t-i-a-l-i-z-e-d │ │ │ │ └── index.html │ │ │ ├── -s-t-a-r-t-e-d │ │ │ │ └── index.html │ │ │ ├── -s-t-o-p-p-e-d │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -default-audio-client-controller │ │ │ ├── -companion │ │ │ │ ├── audio-client-state.html │ │ │ │ └── index.html │ │ │ ├── -default-audio-client-controller.html │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── get-route.html │ │ │ ├── index.html │ │ │ ├── is-voice-focus-enabled.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── set-mute.html │ │ │ ├── set-route.html │ │ │ ├── set-voice-focus-enabled.html │ │ │ ├── start.html │ │ │ └── stop.html │ │ ├── -default-audio-client-observer │ │ │ ├── -default-audio-client-observer.html │ │ │ ├── audio-client.html │ │ │ ├── current-audio-status.html │ │ │ ├── index.html │ │ │ ├── notify-audio-client-observer.html │ │ │ ├── on-attendees-presence-change.html │ │ │ ├── on-audio-client-primary-meeting-event.html │ │ │ ├── on-audio-client-state-change.html │ │ │ ├── on-log-message.html │ │ │ ├── on-metrics.html │ │ │ ├── on-signal-strength-change.html │ │ │ ├── on-transcript-events-received.html │ │ │ ├── on-volume-state-change.html │ │ │ ├── primary-meeting-promotion-observer.html │ │ │ ├── subscribe-to-audio-client-state-change.html │ │ │ ├── subscribe-to-real-time-events.html │ │ │ ├── subscribe-to-transcript-event.html │ │ │ ├── unsubscribe-from-audio-client-state-change.html │ │ │ ├── unsubscribe-from-real-time-events.html │ │ │ └── unsubscribe-from-transcript-event.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.contentshare │ │ ├── -content-share-video-client-controller │ │ │ ├── index.html │ │ │ ├── start-video-share.html │ │ │ ├── stop-video-share.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ └── unsubscribe-from-video-client-state-change.html │ │ ├── -content-share-video-client-observer │ │ │ ├── index.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ └── unsubscribe-from-video-client-state-change.html │ │ ├── -default-content-share-video-client-controller │ │ │ ├── -default-content-share-video-client-controller.html │ │ │ ├── index.html │ │ │ ├── start-video-share.html │ │ │ ├── stop-video-share.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ └── unsubscribe-from-video-client-state-change.html │ │ ├── -default-content-share-video-client-observer │ │ │ ├── -default-content-share-video-client-observer.html │ │ │ ├── camera-send-is-available.html │ │ │ ├── did-connect.html │ │ │ ├── did-fail.html │ │ │ ├── did-receive-frame.html │ │ │ ├── did-stop.html │ │ │ ├── get-available-dns-servers.html │ │ │ ├── index.html │ │ │ ├── is-connecting.html │ │ │ ├── on-camera-changed.html │ │ │ ├── on-log-message.html │ │ │ ├── on-metrics.html │ │ │ ├── on-primary-meeting-demotion.html │ │ │ ├── on-primary-meeting-promotion.html │ │ │ ├── on-remote-video-source-available.html │ │ │ ├── on-remote-video-source-unavailable.html │ │ │ ├── on-turn-u-r-is-received.html │ │ │ ├── pause-remote-video.html │ │ │ ├── request-turn-creds.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ └── unsubscribe-from-video-client-state-change.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.ingestion.database │ │ ├── -d-a-t-a-b-a-s-e_-n-a-m-e.html │ │ ├── -database-manager │ │ │ ├── clear.html │ │ │ ├── create-table.html │ │ │ ├── delete.html │ │ │ ├── drop-table.html │ │ │ ├── index.html │ │ │ ├── insert.html │ │ │ └── query.html │ │ ├── -database-table │ │ │ ├── columns.html │ │ │ ├── index.html │ │ │ ├── primary-key.html │ │ │ └── table-name.html │ │ ├── -dirty-event-s-q-lite-dao │ │ │ ├── -dirty-event-s-q-lite-dao.html │ │ │ ├── columns.html │ │ │ ├── delete-dirty-events-by-ids.html │ │ │ ├── index.html │ │ │ ├── insert-dirty-meeting-event-items.html │ │ │ ├── list-dirty-meeting-event-items.html │ │ │ ├── primary-key.html │ │ │ └── table-name.html │ │ ├── -event-s-q-lite-dao │ │ │ ├── -event-s-q-lite-dao.html │ │ │ ├── columns.html │ │ │ ├── delete-meeting-events-by-ids.html │ │ │ ├── index.html │ │ │ ├── insert-meeting-event.html │ │ │ ├── list-meeting-event-items.html │ │ │ ├── primary-key.html │ │ │ └── table-name.html │ │ ├── -i-n_-m-e-m-o-r-y_-d-a-t-a-b-a-s-e.html │ │ ├── -s-q-lite-database-manager │ │ │ ├── -s-q-lite-database-manager.html │ │ │ ├── clear.html │ │ │ ├── create-table.html │ │ │ ├── delete.html │ │ │ ├── drop-table.html │ │ │ ├── index.html │ │ │ ├── insert.html │ │ │ ├── on-create.html │ │ │ ├── on-upgrade.html │ │ │ └── query.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.ingestion │ │ ├── -dirty-event-dao │ │ │ ├── delete-dirty-events-by-ids.html │ │ │ ├── index.html │ │ │ ├── insert-dirty-meeting-event-items.html │ │ │ └── list-dirty-meeting-event-items.html │ │ ├── -dirty-meeting-event-item │ │ │ ├── -dirty-meeting-event-item.html │ │ │ ├── data.html │ │ │ ├── id.html │ │ │ ├── index.html │ │ │ └── ttl.html │ │ ├── -event-dao │ │ │ ├── delete-meeting-events-by-ids.html │ │ │ ├── index.html │ │ │ ├── insert-meeting-event.html │ │ │ └── list-meeting-event-items.html │ │ ├── -event-type-converters │ │ │ ├── -event-type-converters.html │ │ │ ├── from-meeting-event.html │ │ │ ├── index.html │ │ │ └── to-meeting-event.html │ │ ├── -ingestion-event-converter │ │ │ ├── from-dirty-meeting-event-items.html │ │ │ ├── from-meeting-event-items.html │ │ │ └── index.html │ │ ├── -meeting-event-item │ │ │ ├── -meeting-event-item.html │ │ │ ├── data.html │ │ │ ├── id.html │ │ │ └── index.html │ │ ├── -s-d-k-event │ │ │ ├── -s-d-k-event.html │ │ │ ├── event-attributes.html │ │ │ ├── index.html │ │ │ ├── name.html │ │ │ └── put-attributes.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.metric │ │ ├── -client-metrics-collector │ │ │ ├── index.html │ │ │ ├── process-audio-client-metrics.html │ │ │ ├── process-content-share-video-client-metrics.html │ │ │ ├── process-video-client-metrics.html │ │ │ ├── subscribe-to-metrics.html │ │ │ └── unsubscribe-from-metrics.html │ │ ├── -default-client-metrics-collector │ │ │ ├── -default-client-metrics-collector.html │ │ │ ├── index.html │ │ │ ├── process-audio-client-metrics.html │ │ │ ├── process-content-share-video-client-metrics.html │ │ │ ├── process-video-client-metrics.html │ │ │ ├── subscribe-to-metrics.html │ │ │ └── unsubscribe-from-metrics.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.utils │ │ ├── -app-info-util │ │ │ ├── index.html │ │ │ ├── initialize-audio-client-app-info.html │ │ │ └── initialize-video-client-app-detailed-info.html │ │ ├── -back-off-retry │ │ │ ├── calculate-back-off.html │ │ │ ├── get-retry-count.html │ │ │ ├── increment-retry-count.html │ │ │ ├── index.html │ │ │ ├── is-retry-count-limit-reached.html │ │ │ └── is-retryable-code.html │ │ ├── -concurrent-set │ │ │ ├── -companion │ │ │ │ ├── create-concurrent-set.html │ │ │ │ └── index.html │ │ │ ├── -concurrent-set.html │ │ │ └── index.html │ │ ├── -d-n-s-server-utils │ │ │ ├── get-available-dns-servers.html │ │ │ └── index.html │ │ ├── -default-back-off-retry │ │ │ ├── -default-back-off-retry.html │ │ │ ├── calculate-back-off.html │ │ │ ├── get-retry-count.html │ │ │ ├── increment-retry-count.html │ │ │ ├── index.html │ │ │ ├── is-retry-count-limit-reached.html │ │ │ └── is-retryable-code.html │ │ ├── -device-utils │ │ │ ├── -companion │ │ │ │ ├── device-manufacturer.html │ │ │ │ ├── device-model.html │ │ │ │ ├── device-name.html │ │ │ │ ├── index.html │ │ │ │ ├── media-s-d-k-version.html │ │ │ │ ├── os-name.html │ │ │ │ ├── os-version.html │ │ │ │ ├── sdk-name.html │ │ │ │ └── sdk-version.html │ │ │ ├── -device-utils.html │ │ │ └── index.html │ │ ├── -event-attributes-utils │ │ │ ├── get-common-attributes.html │ │ │ ├── get-ingestion-metadata.html │ │ │ └── index.html │ │ ├── -http-exception │ │ │ ├── -http-exception.html │ │ │ ├── error-code.html │ │ │ ├── error-reason.html │ │ │ └── index.html │ │ ├── -http-response │ │ │ ├── -http-response.html │ │ │ ├── data.html │ │ │ ├── http-exception.html │ │ │ └── index.html │ │ ├── -http-utils │ │ │ ├── index.html │ │ │ └── post.html │ │ ├── -json-utils │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ └── marshal.html │ │ │ ├── -json-utils.html │ │ │ └── index.html │ │ ├── -observer-utils │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ └── notify-observer-on-main-thread.html │ │ │ ├── -observer-utils.html │ │ │ └── index.html │ │ ├── -t-u-r-n-request-utils │ │ │ ├── do-turn-request.html │ │ │ └── index.html │ │ ├── -timezone-utils │ │ │ ├── -companion │ │ │ │ ├── get-utc-offset.html │ │ │ │ └── index.html │ │ │ ├── -timezone-utils.html │ │ │ └── index.html │ │ ├── -video-layout-measure │ │ │ ├── -video-layout-measure.html │ │ │ ├── index.html │ │ │ ├── measure.html │ │ │ └── scaling-type.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.video.gl │ │ ├── -default-egl-renderer │ │ │ ├── -default-egl-renderer.html │ │ │ ├── aspect-ratio.html │ │ │ ├── create-egl-surface.html │ │ │ ├── index.html │ │ │ ├── init.html │ │ │ ├── mirror.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── release-egl-surface.html │ │ │ └── release.html │ │ ├── -default-gl-video-frame-drawer │ │ │ ├── -companion │ │ │ │ └── index.html │ │ │ ├── -default-gl-video-frame-drawer.html │ │ │ ├── draw-frame.html │ │ │ ├── index.html │ │ │ └── release.html │ │ ├── -egl-renderer │ │ │ ├── aspect-ratio.html │ │ │ ├── create-egl-surface.html │ │ │ ├── index.html │ │ │ ├── init.html │ │ │ ├── mirror.html │ │ │ ├── release-egl-surface.html │ │ │ └── release.html │ │ ├── -gl-util │ │ │ ├── -f-u-l-l_-r-e-c-t-a-n-g-l-e_-t-e-x-t-u-r-e_-c-o-o-r-d-i-n-a-t-e-s.html │ │ │ ├── -f-u-l-l_-r-e-c-t-a-n-g-l-e_-v-e-r-t-e-x_-c-o-o-r-d-i-n-a-t-e-s.html │ │ │ ├── check-gl-error.html │ │ │ ├── convert-to-gl-transform-matrix.html │ │ │ ├── convert-to-matrix.html │ │ │ ├── create-program.html │ │ │ ├── generate-texture.html │ │ │ └── index.html │ │ ├── -gl-video-frame-drawer │ │ │ ├── draw-frame.html │ │ │ ├── index.html │ │ │ └── release.html │ │ ├── -share-egl-lock │ │ │ ├── -companion │ │ │ │ ├── -lock.html │ │ │ │ └── index.html │ │ │ ├── -share-egl-lock.html │ │ │ └── index.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal.video │ │ ├── -default-video-client-controller │ │ │ ├── -default-video-client-controller.html │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── destroy-video-client.html │ │ │ ├── get-active-camera.html │ │ │ ├── get-configuration.html │ │ │ ├── index.html │ │ │ ├── initialize-video-client.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── send-data-message.html │ │ │ ├── set-max-bit-rate-kbps.html │ │ │ ├── set-remote-paused.html │ │ │ ├── start-local-video.html │ │ │ ├── start-remote-video.html │ │ │ ├── start-video-client.html │ │ │ ├── start.html │ │ │ ├── stop-and-destroy.html │ │ │ ├── stop-local-video.html │ │ │ ├── stop-remote-video.html │ │ │ ├── stop-video-client.html │ │ │ ├── switch-camera.html │ │ │ └── update-video-source-subscriptions.html │ │ ├── -default-video-client-factory │ │ │ ├── -default-video-client-factory.html │ │ │ ├── get-video-client.html │ │ │ └── index.html │ │ ├── -default-video-client-observer │ │ │ ├── -default-video-client-observer.html │ │ │ ├── camera-send-is-available.html │ │ │ ├── did-connect.html │ │ │ ├── did-fail.html │ │ │ ├── did-receive-frame.html │ │ │ ├── did-stop.html │ │ │ ├── get-available-dns-servers.html │ │ │ ├── index.html │ │ │ ├── is-connecting.html │ │ │ ├── notify-video-tile-observer.html │ │ │ ├── on-camera-changed.html │ │ │ ├── on-data-message-received.html │ │ │ ├── on-log-message.html │ │ │ ├── on-metrics.html │ │ │ ├── on-primary-meeting-demotion.html │ │ │ ├── on-primary-meeting-promotion.html │ │ │ ├── on-remote-video-source-available.html │ │ │ ├── on-remote-video-source-unavailable.html │ │ │ ├── on-turn-u-r-is-received.html │ │ │ ├── pause-remote-video.html │ │ │ ├── primary-meeting-promotion-observer.html │ │ │ ├── request-turn-creds.html │ │ │ ├── subscribe-to-receive-data-message.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ ├── subscribe-to-video-tile-change.html │ │ │ ├── unsubscribe-from-receive-data-message.html │ │ │ ├── unsubscribe-from-video-client-state-change.html │ │ │ └── unsubscribe-from-video-tile-change.html │ │ ├── -default-video-client-state-controller │ │ │ ├── -default-video-client-state-controller.html │ │ │ ├── bind-lifecycle-handler.html │ │ │ ├── can-act.html │ │ │ ├── index.html │ │ │ ├── start.html │ │ │ ├── stop.html │ │ │ └── update-state.html │ │ ├── -t-u-r-n-credentials │ │ │ ├── -companion │ │ │ │ ├── -t-u-r-n_-c-r-e-d-e-n-t-i-a-l-s_-r-e-s-u-l-t_-p-a-s-s-w-o-r-d.html │ │ │ │ ├── -t-u-r-n_-c-r-e-d-e-n-t-i-a-l-s_-r-e-s-u-l-t_-t-t-l.html │ │ │ │ ├── -t-u-r-n_-c-r-e-d-e-n-t-i-a-l-s_-r-e-s-u-l-t_-u-r-i-s.html │ │ │ │ ├── -t-u-r-n_-c-r-e-d-e-n-t-i-a-l-s_-r-e-s-u-l-t_-u-s-e-r-n-a-m-e.html │ │ │ │ └── index.html │ │ │ ├── -t-u-r-n-credentials.html │ │ │ ├── index.html │ │ │ ├── password.html │ │ │ ├── ttl.html │ │ │ ├── uris.html │ │ │ └── username.html │ │ ├── -t-u-r-n-request-params │ │ │ ├── -t-u-r-n-request-params.html │ │ │ ├── index.html │ │ │ ├── join-token.html │ │ │ ├── meeting-id.html │ │ │ ├── signaling-url.html │ │ │ └── turn-control-url.html │ │ ├── -video-client-controller │ │ │ ├── demote-from-primary-meeting.html │ │ │ ├── get-active-camera.html │ │ │ ├── get-configuration.html │ │ │ ├── index.html │ │ │ ├── promote-to-primary-meeting.html │ │ │ ├── send-data-message.html │ │ │ ├── set-max-bit-rate-kbps.html │ │ │ ├── set-remote-paused.html │ │ │ ├── start-local-video.html │ │ │ ├── start-remote-video.html │ │ │ ├── start.html │ │ │ ├── stop-and-destroy.html │ │ │ ├── stop-local-video.html │ │ │ ├── stop-remote-video.html │ │ │ ├── switch-camera.html │ │ │ └── update-video-source-subscriptions.html │ │ ├── -video-client-factory │ │ │ ├── get-video-client.html │ │ │ └── index.html │ │ ├── -video-client-lifecycle-handler │ │ │ ├── destroy-video-client.html │ │ │ ├── index.html │ │ │ ├── initialize-video-client.html │ │ │ ├── start-video-client.html │ │ │ └── stop-video-client.html │ │ ├── -video-client-observer │ │ │ ├── index.html │ │ │ ├── notify-video-tile-observer.html │ │ │ ├── primary-meeting-promotion-observer.html │ │ │ ├── subscribe-to-receive-data-message.html │ │ │ ├── subscribe-to-video-client-state-change.html │ │ │ ├── subscribe-to-video-tile-change.html │ │ │ ├── unsubscribe-from-receive-data-message.html │ │ │ ├── unsubscribe-from-video-client-state-change.html │ │ │ └── unsubscribe-from-video-tile-change.html │ │ ├── -video-client-state-controller │ │ │ ├── bind-lifecycle-handler.html │ │ │ ├── can-act.html │ │ │ ├── index.html │ │ │ ├── start.html │ │ │ ├── stop.html │ │ │ └── update-state.html │ │ ├── -video-client-state │ │ │ ├── -i-n-i-t-i-a-l-i-z-e-d │ │ │ │ └── index.html │ │ │ ├── -s-t-a-r-t-e-d │ │ │ │ └── index.html │ │ │ ├── -s-t-o-p-p-e-d │ │ │ │ └── index.html │ │ │ ├── -u-n-i-n-i-t-i-a-l-i-z-e-d │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -video-source-adapter │ │ │ ├── -video-frame-i420-buffer-adapter │ │ │ │ ├── -video-frame-i420-buffer-adapter.html │ │ │ │ ├── get-data-u.html │ │ │ │ ├── get-data-v.html │ │ │ │ ├── get-data-y.html │ │ │ │ ├── get-height.html │ │ │ │ ├── get-stride-u.html │ │ │ │ ├── get-stride-v.html │ │ │ │ ├── get-stride-y.html │ │ │ │ ├── get-width.html │ │ │ │ ├── index.html │ │ │ │ ├── release.html │ │ │ │ └── retain.html │ │ │ ├── -video-frame-r-g-b-a-buffer-adapter │ │ │ │ ├── -video-frame-r-g-b-a-buffer-adapter.html │ │ │ │ ├── get-data.html │ │ │ │ ├── get-height.html │ │ │ │ ├── get-stride.html │ │ │ │ ├── get-width.html │ │ │ │ ├── index.html │ │ │ │ ├── release.html │ │ │ │ └── retain.html │ │ │ ├── -video-frame-texture-buffer-adapter │ │ │ │ ├── -video-frame-texture-buffer-adapter.html │ │ │ │ ├── get-height.html │ │ │ │ ├── get-texture-id.html │ │ │ │ ├── get-transform-matrix.html │ │ │ │ ├── get-type.html │ │ │ │ ├── get-width.html │ │ │ │ ├── index.html │ │ │ │ ├── release.html │ │ │ │ └── retain.html │ │ │ ├── -video-source-adapter.html │ │ │ ├── add-sink.html │ │ │ ├── get-content-hint.html │ │ │ ├── index.html │ │ │ ├── on-video-frame-received.html │ │ │ ├── remove-sink.html │ │ │ └── source.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.internal │ │ ├── -attendee-status │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -dropped │ │ │ │ └── index.html │ │ │ ├── -joined │ │ │ │ └── index.html │ │ │ ├── -left │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -session-state-controller-action │ │ │ ├── -connecting │ │ │ │ └── index.html │ │ │ ├── -disconnecting │ │ │ │ └── index.html │ │ │ ├── -fail │ │ │ │ └── index.html │ │ │ ├── -finish-connecting │ │ │ │ └── index.html │ │ │ ├── -finish-disconnecting │ │ │ │ └── index.html │ │ │ ├── -finish-updating │ │ │ │ └── index.html │ │ │ ├── -init │ │ │ │ └── index.html │ │ │ ├── -reconnecting │ │ │ │ └── index.html │ │ │ ├── -unknown │ │ │ │ └── index.html │ │ │ ├── -updating │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.realtime.datamessage │ │ ├── -data-message-observer │ │ │ ├── index.html │ │ │ └── on-data-message-received.html │ │ ├── -data-message │ │ │ ├── -data-message.html │ │ │ ├── data.html │ │ │ ├── from-json.html │ │ │ ├── index.html │ │ │ ├── sender-attendee-id.html │ │ │ ├── sender-external-user-id.html │ │ │ ├── text.html │ │ │ ├── throttled.html │ │ │ ├── timestamp-ms.html │ │ │ └── topic.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.realtime │ │ ├── -default-realtime-controller │ │ │ ├── -default-realtime-controller.html │ │ │ ├── add-realtime-data-message-observer.html │ │ │ ├── add-realtime-observer.html │ │ │ ├── add-realtime-transcript-event-observer.html │ │ │ ├── index.html │ │ │ ├── realtime-is-voice-focus-enabled.html │ │ │ ├── realtime-local-mute.html │ │ │ ├── realtime-local-unmute.html │ │ │ ├── realtime-send-data-message.html │ │ │ ├── realtime-set-voice-focus-enabled.html │ │ │ ├── remove-realtime-data-message-observer-from-topic.html │ │ │ ├── remove-realtime-observer.html │ │ │ └── remove-realtime-transcript-event-observer.html │ │ ├── -realtime-controller-facade │ │ │ ├── add-realtime-data-message-observer.html │ │ │ ├── add-realtime-observer.html │ │ │ ├── add-realtime-transcript-event-observer.html │ │ │ ├── index.html │ │ │ ├── realtime-is-voice-focus-enabled.html │ │ │ ├── realtime-local-mute.html │ │ │ ├── realtime-local-unmute.html │ │ │ ├── realtime-send-data-message.html │ │ │ ├── realtime-set-voice-focus-enabled.html │ │ │ ├── remove-realtime-data-message-observer-from-topic.html │ │ │ ├── remove-realtime-observer.html │ │ │ └── remove-realtime-transcript-event-observer.html │ │ ├── -realtime-observer │ │ │ ├── index.html │ │ │ ├── on-attendees-dropped.html │ │ │ ├── on-attendees-joined.html │ │ │ ├── on-attendees-left.html │ │ │ ├── on-attendees-muted.html │ │ │ ├── on-attendees-unmuted.html │ │ │ ├── on-signal-strength-changed.html │ │ │ └── on-volume-changed.html │ │ ├── -transcript-event-observer │ │ │ ├── index.html │ │ │ └── on-transcript-event-received.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.session │ │ ├── -attendee │ │ │ ├── -attendee-id.html │ │ │ ├── -attendee.html │ │ │ ├── -external-user-id.html │ │ │ ├── -join-token.html │ │ │ └── index.html │ │ ├── -create-attendee-response │ │ │ ├── -attendee.html │ │ │ ├── -create-attendee-response.html │ │ │ └── index.html │ │ ├── -create-meeting-response │ │ │ ├── -create-meeting-response.html │ │ │ ├── -meeting.html │ │ │ └── index.html │ │ ├── -default-meeting-session │ │ │ ├── -default-meeting-session.html │ │ │ ├── audio-video.html │ │ │ ├── configuration.html │ │ │ ├── event-analytics-controller.html │ │ │ ├── index.html │ │ │ └── logger.html │ │ ├── -media-placement │ │ │ ├── -audio-fallback-url.html │ │ │ ├── -audio-host-url.html │ │ │ ├── -event-ingestion-url.html │ │ │ ├── -media-placement.html │ │ │ ├── -signaling-url.html │ │ │ ├── -turn-control-url.html │ │ │ └── index.html │ │ ├── -meeting-features │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ ├── invoke.html │ │ │ │ └── parse-max-resolution.html │ │ │ ├── -meeting-features.html │ │ │ ├── content-max-resolution.html │ │ │ ├── index.html │ │ │ └── video-max-resolution.html │ │ ├── -meeting-session-configuration │ │ │ ├── -meeting-session-configuration.html │ │ │ ├── create-content-share-meeting-session-configuration.html │ │ │ ├── credentials.html │ │ │ ├── external-meeting-id.html │ │ │ ├── features.html │ │ │ ├── index.html │ │ │ ├── meeting-id.html │ │ │ └── urls.html │ │ ├── -meeting-session-credentials │ │ │ ├── -meeting-session-credentials.html │ │ │ ├── attendee-id.html │ │ │ ├── external-user-id.html │ │ │ ├── index.html │ │ │ └── join-token.html │ │ ├── -meeting-session-status-code │ │ │ ├── -audio-authentication-rejected │ │ │ │ └── index.html │ │ │ ├── -audio-call-at-capacity │ │ │ │ └── index.html │ │ │ ├── -audio-call-ended │ │ │ │ └── index.html │ │ │ ├── -audio-disconnect-audio │ │ │ │ └── index.html │ │ │ ├── -audio-disconnected │ │ │ │ └── index.html │ │ │ ├── -audio-input-device-not-responding │ │ │ │ └── index.html │ │ │ ├── -audio-internal-server-error │ │ │ │ └── index.html │ │ │ ├── -audio-joined-from-another-device │ │ │ │ └── index.html │ │ │ ├── -audio-output-device-not-responding │ │ │ │ └── index.html │ │ │ ├── -audio-server-hungup │ │ │ │ └── index.html │ │ │ ├── -audio-service-unavailable │ │ │ │ └── index.html │ │ │ ├── -companion │ │ │ │ ├── from.html │ │ │ │ └── index.html │ │ │ ├── -connection-health-reconnect │ │ │ │ └── index.html │ │ │ ├── -left │ │ │ │ └── index.html │ │ │ ├── -network-became-poor │ │ │ │ └── index.html │ │ │ ├── -o-k │ │ │ │ └── index.html │ │ │ ├── -video-at-capacity-view-only │ │ │ │ └── index.html │ │ │ ├── -video-service-failed │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -meeting-session-status │ │ │ ├── -meeting-session-status.html │ │ │ ├── index.html │ │ │ └── status-code.html │ │ ├── -meeting-session-u-r-ls │ │ │ ├── -meeting-session-u-r-ls.html │ │ │ ├── audio-fallback-u-r-l.html │ │ │ ├── audio-host-u-r-l.html │ │ │ ├── index.html │ │ │ ├── ingestion-u-r-l.html │ │ │ ├── signaling-u-r-l.html │ │ │ ├── turn-control-u-r-l.html │ │ │ └── url-rewriter.html │ │ ├── -meeting-session │ │ │ ├── audio-video.html │ │ │ ├── configuration.html │ │ │ ├── event-analytics-controller.html │ │ │ ├── index.html │ │ │ └── logger.html │ │ ├── -meeting │ │ │ ├── -external-meeting-id.html │ │ │ ├── -media-placement.html │ │ │ ├── -media-region.html │ │ │ ├── -meeting-features.html │ │ │ ├── -meeting-id.html │ │ │ ├── -meeting.html │ │ │ └── index.html │ │ ├── -u-r-l-rewriter │ │ │ └── index.html │ │ ├── default-url-rewriter.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.utils.logger │ │ ├── -console-logger │ │ │ ├── -console-logger.html │ │ │ ├── debug.html │ │ │ ├── error.html │ │ │ ├── get-log-level.html │ │ │ ├── index.html │ │ │ ├── info.html │ │ │ ├── set-log-level.html │ │ │ ├── verbose.html │ │ │ └── warn.html │ │ ├── -log-level │ │ │ ├── -d-e-b-u-g │ │ │ │ └── index.html │ │ │ ├── -e-r-r-o-r │ │ │ │ └── index.html │ │ │ ├── -i-n-f-o │ │ │ │ └── index.html │ │ │ ├── -o-f-f │ │ │ │ └── index.html │ │ │ ├── -v-e-r-b-o-s-e │ │ │ │ └── index.html │ │ │ ├── -w-a-r-n │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── priority.html │ │ │ ├── value-of.html │ │ │ └── values.html │ │ ├── -logger │ │ │ ├── debug.html │ │ │ ├── error.html │ │ │ ├── get-log-level.html │ │ │ ├── index.html │ │ │ ├── info.html │ │ │ ├── set-log-level.html │ │ │ ├── verbose.html │ │ │ └── warn.html │ │ └── index.html │ ├── com.amazonaws.services.chime.sdk.meetings.utils │ │ ├── -default-modality │ │ │ ├── -companion │ │ │ │ ├── -m-o-d-a-l-i-t-y_-s-e-p-a-r-a-t-o-r.html │ │ │ │ └── index.html │ │ │ ├── -default-modality.html │ │ │ ├── base.html │ │ │ ├── has-modality.html │ │ │ ├── id.html │ │ │ ├── index.html │ │ │ └── modality.html │ │ ├── -gl-texture-frame-buffer-helper │ │ │ ├── -gl-texture-frame-buffer-helper.html │ │ │ ├── frame-buffer-id.html │ │ │ ├── height.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ ├── set-size.html │ │ │ ├── texture-id.html │ │ │ └── width.html │ │ ├── -modality-type │ │ │ ├── -companion │ │ │ │ ├── from-value.html │ │ │ │ └── index.html │ │ │ ├── -content │ │ │ │ └── index.html │ │ │ ├── entries.html │ │ │ ├── index.html │ │ │ ├── value-of.html │ │ │ ├── value.html │ │ │ └── values.html │ │ ├── -ref-count-delegate │ │ │ ├── -ref-count-delegate.html │ │ │ ├── index.html │ │ │ ├── release.html │ │ │ └── retain.html │ │ ├── -versioning │ │ │ ├── -companion │ │ │ │ ├── index.html │ │ │ │ └── sdk-version.html │ │ │ ├── -versioning.html │ │ │ └── index.html │ │ └── index.html │ ├── index.html │ ├── navigation.html │ ├── package-list │ └── scripts │ │ ├── pages.json │ │ └── sourceset_dependencies.js ├── images │ ├── anchor-copy-button.svg │ ├── arrow_down.svg │ ├── burger.svg │ ├── copy-icon.svg │ ├── copy-successful-icon.svg │ ├── footer-go-to-link.svg │ ├── go-to-top-icon.svg │ ├── homepage.svg │ ├── logo-icon.svg │ ├── nav-icons │ │ ├── abstract-class-kotlin.svg │ │ ├── abstract-class.svg │ │ ├── annotation-kotlin.svg │ │ ├── annotation.svg │ │ ├── class-kotlin.svg │ │ ├── class.svg │ │ ├── enum-kotlin.svg │ │ ├── enum.svg │ │ ├── exception-class.svg │ │ ├── field-value.svg │ │ ├── field-variable.svg │ │ ├── function.svg │ │ ├── interface-kotlin.svg │ │ ├── interface.svg │ │ ├── object.svg │ │ └── typealias-kotlin.svg │ └── theme-toggle.svg ├── index.html ├── navigation.html ├── package-list ├── scripts │ ├── clipboard.js │ ├── main.js │ ├── navigation-loader.js │ ├── pages.json │ ├── platform-content-handler.js │ ├── prism.js │ ├── sourceset_dependencies.js │ └── symbol-parameters-wrapper_deferred.js └── styles │ ├── font-jb-sans-auto.css │ ├── logo-styles.css │ ├── main.css │ ├── prism.css │ └── style.css ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── guides ├── api_overview.md ├── background_video_filters.md ├── configuring_remote_video_subscription.md ├── content_share.md ├── custom_video.md ├── event_ingestion.md ├── getting_started.md ├── meeting_events.md ├── replicated_meetings.md └── video_pagination.md ├── pre-commit ├── publishing.gradle ├── pull_request_template.md └── settings.gradle /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Logs** 24 | If applicable, add logs from logcat to help explain your problem. 25 | 26 | **Screenshots** 27 | If applicable, add screenshots to help explain your problem. 28 | 29 | **Test environment Info (please complete the following information):** 30 | - Device: [e.g. Pixel3] 31 | - OS: [e.g. Android 10] 32 | - Version amazon-chime-sdk: [e.g. 0.4.0] 33 | - Version amazon-chime-sdk-media: [e.g. 0.4.0] 34 | - Can you reproduce this in the demo app? 35 | **If you are reporting a crash:** 36 | - How often is this crash occurring? 37 | - Are there metrics on CPU or memory use at the time of the crash? 38 | - Please provide full crash logs. 39 | 40 | **Additional context** 41 | Add any other context about the problem here. 42 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/community-request-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Community Request Template 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature-request 6 | assignees: '' 7 | 8 | --- 9 | 10 | # Community Note 11 | * Please vote for this issue by adding a 👍 reaction to the issue. This will help the community and maintainers from the Amazon Chime SDK team to prioritize this request. 12 | * Please do not leave "+1" or "me too" comments, they generate extra noise for issue followers and do not help prioritize the request. 13 | * Please go through the existing [issues](https://github.com/aws/amazon-chime-sdk-android/issues) to see if your request has already been recommended. 14 | * Please do not use this template for bugs or support. Each individual repository has a PR template, documentation and resources for troubleshooting. 15 | * If you are interested in working on this issue or have submitted a pull request, please leave a comment. 16 | 17 | # Tell us about your request 18 | ## What do you want us to build? 19 | Which Amazon Chime SDK or feature area is this request for? 20 | Such as: [amazon-chime-sdk-js](https://github.com/aws/amazon-chime-sdk-js), [amazon-chime-sdk-ios](https://github.com/aws/amazon-chime-sdk-ios), [amazon-chime-sdk-android](https://github.com/aws/amazon-chime-sdk-android), [amazon-chime-sdk-component-library-react](https://github.com/aws/amazon-chime-sdk-component-library-react), a new feature idea. 21 | 22 | ## Tell us about the problem you are trying to solve and why is it hard? 23 | The more details you provide us, the better we will be able to help you. 24 | 25 | ## How are you currently solving a problem? 26 | Are there any workarounds or mitigations you have used? Why is it not working for you? 27 | 28 | ## Additional context 29 | Anything else we should know? 30 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 9 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 14 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - crash 8 | - bug 9 | - documentation 10 | - feature-request 11 | # Label to use when marking an issue as stale 12 | staleLabel: inactive 13 | # Comment to post when marking an issue as stale. Set to `false` to disable 14 | markComment: > 15 | This issue has been automatically marked as stale because it has not had 16 | recent activity. It will be closed if no further activity occurs. Thank you 17 | for your contributions. 18 | # Comment to post when closing a stale issue. Set to `false` to disable 19 | closeComment: false -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | local.properties 4 | .idea 5 | .DS_Store 6 | /build 7 | /captures 8 | .externalNativeBuild 9 | .cxx 10 | amazon-chime-sdk/docs 11 | /libs 12 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | ## Code of Conduct 2 | This project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct). 3 | For more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact 4 | opensource-codeofconduct@amazon.com with any additional questions or comments. 5 | -------------------------------------------------------------------------------- /NOTICE.txt: -------------------------------------------------------------------------------- 1 | Amazon Chime SDK for Android (amazon-chime-sdk-android) 2 | Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. -------------------------------------------------------------------------------- /amazon-chime-sdk/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /libs 3 | jacoco.exec 4 | -------------------------------------------------------------------------------- /amazon-chime-sdk/consumer-rules.pro: -------------------------------------------------------------------------------- 1 | -keep class com.amazonaws.services.chime.sdk.meetings.session.** { *; } 2 | -------------------------------------------------------------------------------- /amazon-chime-sdk/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/androidTest/res/raw/background_blurred_image.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/amazon-chime-sdk/src/androidTest/res/raw/background_blurred_image.jpeg -------------------------------------------------------------------------------- /amazon-chime-sdk/src/androidTest/res/raw/background_ml_test_image.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/amazon-chime-sdk/src/androidTest/res/raw/background_ml_test_image.jpeg -------------------------------------------------------------------------------- /amazon-chime-sdk/src/androidTest/res/raw/background_replaced_image.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/amazon-chime-sdk/src/androidTest/res/raw/background_replaced_image.jpeg -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/analytics/EventAnalyticsFacade.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | /** 9 | * [EventAnalyticsFacade] allows builders to listen to meeting analytics events 10 | * through adding/removing [EventAnalyticsObserver]. 11 | * 12 | * For instance, if meeting start succeeded, you'll receive data 13 | * [EventAnalyticsObserver.onEventReceived] with name as [EventName] and attributes as [EventAttributes], 14 | * which is just [Map]. This will include attributes specific to the event. 15 | * 16 | * For more information about the attributes, please refer to [EventAttributeName]. 17 | * 18 | * It can have additional attributes based on the event. 19 | */ 20 | interface EventAnalyticsFacade { 21 | /** 22 | * Subscribe to meeting event related data with an observer. 23 | * 24 | * @param observer: [EventAnalyticsObserver] - An observer to add to start receiving meeting events 25 | */ 26 | fun addEventAnalyticsObserver(observer: EventAnalyticsObserver) 27 | 28 | /** 29 | * Unsubscribe from meeting event by removing the specified observer. 30 | * 31 | * @param observer: [EventAnalyticsObserver] - An observer to remove to stop receiving meeting events 32 | */ 33 | fun removeEventAnalyticsObserver(observer: EventAnalyticsObserver) 34 | 35 | /** 36 | * Retrieve meeting history. 37 | */ 38 | fun getMeetingHistory(): List 39 | 40 | /** 41 | * Retrieve common attributes, including deviceName, osName, and more. 42 | */ 43 | fun getCommonEventAttributes(): EventAttributes 44 | } 45 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/analytics/EventAnalyticsObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | /** 9 | * [EventAnalyticsObserver] handles events regarding to analytics. 10 | */ 11 | interface EventAnalyticsObserver { 12 | /** 13 | * Called when specific events occur during the meeting. Each event includes attributes of the event. 14 | * 15 | * For more information about the attributes, please refer to [EventAttributeName]. 16 | * 17 | * One example could be [EventName] as [EventName.meetingStartSucceeded] and 18 | * attributes would be [MutableMap] of [EventAttributeName] and it's value. 19 | * 20 | * @param name: [EventName] - name of meeting event 21 | * @param attributes: [EventAttributes] - attributes of meeting event 22 | * 23 | * NOTE: all callbacks will be called on main thread. 24 | */ 25 | fun onEventReceived(name: EventName, attributes: EventAttributes) 26 | } 27 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/analytics/EventAttributes.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.utils.JsonUtils 9 | 10 | /** 11 | * [EventAttributes] describes meeting event. 12 | */ 13 | typealias EventAttributes = MutableMap 14 | 15 | /** 16 | * Convert event attributes into JSON string. 17 | * 18 | * @return string 19 | */ 20 | fun EventAttributes.toJsonString(): String { 21 | return JsonUtils.marshal(this) 22 | } 23 | 24 | fun EventAttributes.toStringKeyMap(): Map = this.map { (k, v) -> k.name to v }.toMap() 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/analytics/EventName.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | /** 9 | * [EventName] represent sdk event that could help builders to analyze the data. 10 | */ 11 | enum class EventName { 12 | /** 13 | * The camera selection failed. 14 | */ 15 | videoInputFailed, 16 | 17 | /** 18 | * The meeting will start. 19 | */ 20 | meetingStartRequested, 21 | 22 | /** 23 | * The meeting started. 24 | */ 25 | meetingStartSucceeded, 26 | 27 | /** 28 | * The meeting failed to start. 29 | */ 30 | meetingStartFailed, 31 | 32 | /** 33 | * The meeting ended. 34 | */ 35 | meetingEnded, 36 | 37 | /** 38 | * The meeting ended with failure. 39 | */ 40 | meetingFailed 41 | } 42 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/analytics/MeetingHistoryEvent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | data class MeetingHistoryEvent(val meetingHistoryEventName: MeetingHistoryEventName, val timestamp: Long) 9 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/AttendeeUpdate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo 7 | 8 | data class AttendeeInfo(val attendeeId: String, val externalUserId: String) 9 | 10 | data class VolumeUpdate(val attendeeInfo: AttendeeInfo, val volumeLevel: VolumeLevel) 11 | 12 | data class SignalUpdate(val attendeeInfo: AttendeeInfo, val signalStrength: SignalStrength) 13 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/AudioVideoFacade.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventAnalyticsFacade 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerdetector.ActiveSpeakerDetectorFacade 10 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare.ContentShareController 11 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoTileControllerFacade 12 | import com.amazonaws.services.chime.sdk.meetings.device.DeviceController 13 | import com.amazonaws.services.chime.sdk.meetings.realtime.RealtimeControllerFacade 14 | 15 | interface AudioVideoFacade : AudioVideoControllerFacade, 16 | RealtimeControllerFacade, 17 | DeviceController, 18 | VideoTileControllerFacade, 19 | ActiveSpeakerDetectorFacade, 20 | ContentShareController, 21 | EventAnalyticsFacade 22 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/SignalStrength.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo 7 | 8 | /** 9 | * [SignalStrength] describes the signal strength of an attendee for audio 10 | */ 11 | enum class SignalStrength(val value: Int) { 12 | /** 13 | * The attendee has no signal 14 | */ 15 | None(0), 16 | 17 | /** 18 | * The attendee has low signal 19 | */ 20 | Low(1), 21 | 22 | /** 23 | * The attendee has high signal 24 | */ 25 | High(2); 26 | 27 | companion object { 28 | fun from(intValue: Int): SignalStrength? = values().find { it.value == intValue } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/VolumeLevel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo 7 | 8 | /** 9 | * [VolumeLevel] describes the volume level of an attendee for audio 10 | */ 11 | enum class VolumeLevel(val value: Int) { 12 | /** 13 | * The attendee is muted 14 | */ 15 | Muted(-1), 16 | 17 | /** 18 | * The attendee is not speaking 19 | */ 20 | NotSpeaking(0), 21 | 22 | /** 23 | * The attendee is speaking at low volume 24 | */ 25 | Low(1), 26 | 27 | /** 28 | * The attendee is speaking at medium volume 29 | */ 30 | Medium(2), 31 | 32 | /** 33 | * The attendee is speaking at high volume 34 | */ 35 | High(3); 36 | 37 | companion object { 38 | fun from(intValue: Int): VolumeLevel? = values().find { it.value == intValue } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/AudioRecordingPresetOverride.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio 7 | 8 | /** 9 | * [AudioRecordingPresetOverride] describes the audio recording preset in which 10 | * the audio client should operate during a meeting session. 11 | * The values below (except None) directly map to the values defined in: 12 | * https://android.googlesource.com/platform/frameworks/wilhelm/+/master/include/SLES/OpenSLES_AndroidConfiguration.h 13 | */ 14 | enum class AudioRecordingPresetOverride { 15 | 16 | /** 17 | * No preset override. We will use default preset depending on the mode of operation 18 | */ 19 | None, 20 | 21 | /** 22 | * Equivalent of SL_ANDROID_RECORDING_PRESET_GENERIC in openSLES 23 | */ 24 | Generic, 25 | 26 | /** 27 | * Equivalent of SL_ANDROID_RECORDING_PRESET_CAMCORDER in openSLES 28 | */ 29 | Camcorder, 30 | 31 | /** 32 | * Equivalent of SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION in openSLES 33 | */ 34 | VoiceRecognition, 35 | 36 | /** 37 | * Equivalent of SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION in openSLES 38 | */ 39 | VoiceCommunication 40 | } 41 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/AudioStreamType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio 7 | 8 | /** 9 | * [AudioStreamType] describes the audio stream type in which the audio client should operate 10 | * during a meeting session. 11 | */ 12 | enum class AudioStreamType { 13 | 14 | /** 15 | * Equivalent of AudioManager.STREAM_VOICE_CALL 16 | * https://developer.android.com/reference/android/media/AudioManager#STREAM_VOICE_CALL 17 | */ 18 | VoiceCall, 19 | 20 | /** 21 | * Equivalent of AudioManager.STREAM_MUSIC 22 | * https://developer.android.com/reference/android/media/AudioManager#STREAM_MUSIC 23 | * Note that the meeting session volume cannot be adjusted by the volume button with [Music] 24 | * except for Oculus Quest 2. 25 | */ 26 | Music 27 | } 28 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/activespeakerdetector/ActiveSpeakerDetectorFacade.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerdetector 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerpolicy.ActiveSpeakerPolicy 9 | 10 | /** 11 | * [ActiveSpeakerDetectorFacade] provides API calls to add and remove 12 | * active speaker observers. 13 | */ 14 | 15 | interface ActiveSpeakerDetectorFacade { 16 | 17 | /** 18 | * Adds an active speaker observer along with a policy to calculate active speaker scores 19 | * 20 | * @param policy: [ActiveSpeakerPolicy] - Lets you specify a policy to calculate active speaker scores 21 | * @param observer: [ActiveSpeakerObserver] - Lets you specify an observer to active speaker updates 22 | */ 23 | fun addActiveSpeakerObserver( 24 | policy: ActiveSpeakerPolicy, 25 | observer: ActiveSpeakerObserver 26 | ) 27 | 28 | /** 29 | * Removes an active speaker observer. 30 | * 31 | * @param observer: [ActiveSpeakerObserver] - Lets you remove an observer from active speaker updates 32 | */ 33 | fun removeActiveSpeakerObserver(observer: ActiveSpeakerObserver) 34 | } 35 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/activespeakerdetector/ActiveSpeakerObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerdetector 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AttendeeInfo 9 | 10 | /** 11 | * [ActiveSpeakerObserver] handles active speaker detection and score changes for attendees. 12 | */ 13 | interface ActiveSpeakerObserver { 14 | /** 15 | * @property scoreCallbackIntervalMs: Int? Specifies period (in milliseconds) of updates for 16 | * onActiveSpeakerScoreChange. If this is null, the observer will not get active 17 | * speaker score updates. Should be a value greater than 0. 18 | */ 19 | val scoreCallbackIntervalMs: Int? 20 | 21 | /** 22 | * Notifies observers of changes to active speaker. 23 | * 24 | * @param attendeeInfo: Array<[AttendeeInfo]> - An array of active speakers in decreasing order of score. 25 | */ 26 | fun onActiveSpeakerDetected(attendeeInfo: Array) 27 | 28 | /** 29 | * Periodically sends active speaker scores to observers ONLY IF 30 | * scoreCallbackIntervalMs is not null 31 | * 32 | * @param scores: Map<[AttendeeInfo], Double> - Map of active speakers to respective scores. 33 | * Scores of 0 mean the attendee is not an active speaker. 34 | */ 35 | fun onActiveSpeakerScoreChanged(scores: Map) 36 | } 37 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/activespeakerpolicy/ActiveSpeakerPolicy.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerpolicy 6 | 7 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AttendeeInfo 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.VolumeLevel 9 | 10 | /** 11 | * [ActiveSpeakerPolicy] calculates a normalized score of how active a speaker is. Implementations 12 | * of [ActiveSpeakerPolicy] provide custom algorithms for calculating the score. 13 | */ 14 | interface ActiveSpeakerPolicy { 15 | /** 16 | * Return the score of the speaker. If the score is 0, this speaker is not active. 17 | * 18 | * @param attendeeInfo: [AttendeeInfo] - Attendee information containing attendeeId and 19 | * externalUserId 20 | * @param volume: [VolumeLevel] - Current volume of attendee 21 | */ 22 | fun calculateScore(attendeeInfo: AttendeeInfo, volume: VolumeLevel): Double 23 | } 24 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/contentshare/ContentShareObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare 7 | 8 | /** 9 | * [ContentShareObserver] handles all callbacks related to the content share. 10 | * By implementing the callback functions and registering with [ContentShareController.addContentShareObserver], 11 | * one can get notified with content share status events. 12 | */ 13 | interface ContentShareObserver { 14 | /** 15 | * Called when the content share has started. 16 | * This callback will be on the main thread. 17 | */ 18 | fun onContentShareStarted() 19 | 20 | /** 21 | * Called when the content is no longer shared with other attendees 22 | * with the reason provided in the status. 23 | * 24 | * If you no longer need the source producing frames, 25 | * most builders can stop the source after this callback is invoked. 26 | * 27 | * @param status: [ContentShareStatus] - the reason why the content share has stopped 28 | */ 29 | fun onContentShareStopped(status: ContentShareStatus) 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/contentshare/ContentShareSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoSource 9 | 10 | /** 11 | * [ContentShareSource] contains the media sources to attach to the content share 12 | */ 13 | open class ContentShareSource { 14 | open var videoSource: VideoSource? = null 15 | } 16 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/contentshare/ContentShareStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare 7 | 8 | /** 9 | * [ContentShareStatus] indicates a status received regarding the content share. 10 | * 11 | * @param statusCode: [ContentShareStatusCode] - Additional details for the status 12 | */ 13 | data class ContentShareStatus(val statusCode: ContentShareStatusCode) 14 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/contentshare/ContentShareStatusCode.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare 7 | 8 | /** 9 | * [ContentShareStatusCode] indicates the reason the content share event occurred. 10 | */ 11 | enum class ContentShareStatusCode { 12 | /** 13 | * No failure. 14 | */ 15 | OK, 16 | 17 | /** 18 | * Content share video connection is in an unrecoverable failed state. 19 | * Restart content share connection when this error is encountered. 20 | */ 21 | VideoServiceFailed; 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/metric/MetricsObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.metric 7 | 8 | /** 9 | * [MetricsObserver] handles events related to audio/video metrics. 10 | * 11 | * Note: all callbacks will be called on main thread. 12 | */ 13 | interface MetricsObserver { 14 | /** 15 | * Called when metrics are received. 16 | * 17 | * Note: this callback will be called on main thread. 18 | * 19 | * @param metrics: Map - Map of metric type to value 20 | */ 21 | fun onMetricsReceived(metrics: Map) 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/DefaultVideoRenderView.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | import android.content.Context 9 | import android.util.AttributeSet 10 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl.SurfaceRenderView 11 | 12 | class DefaultVideoRenderView @JvmOverloads constructor( 13 | context: Context, 14 | attrs: AttributeSet? = null, 15 | defStyle: Int = 0 16 | ) : SurfaceRenderView(context, attrs, defStyle) 17 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/DefaultVideoTileFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger 9 | 10 | class DefaultVideoTileFactory(private val logger: Logger) : VideoTileFactory { 11 | override fun makeTile( 12 | tileId: Int, 13 | attendeeId: String, 14 | videoStreamContentWidth: Int, 15 | videoStreamContentHeight: Int, 16 | isLocalTile: Boolean 17 | ): VideoTile { 18 | return DefaultVideoTile(logger, tileId, attendeeId, videoStreamContentWidth, videoStreamContentHeight, isLocalTile) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/LocalVideoConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | /** 4 | * Contains configuration for a local video or content share to be sent 5 | * 6 | * @property maxBitRateKbps: Int - The max bit rate for video encoding, should be greater than 0 7 | * Actual quality achieved may vary throughout the call depending on what system and network can provide 8 | */ 9 | data class LocalVideoConfiguration @JvmOverloads constructor( 10 | private val maxBitRateKbps: Int = 0 11 | ) { 12 | val safeMaxBitRateKbps: Int 13 | get() = if (maxBitRateKbps < 0) 0 else maxBitRateKbps 14 | } 15 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/RemoteVideoSource.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | /** 4 | * A video source available in the current meeting. RemoteVideoSource need to be consistent between `remoteVideoSourcesDidBecomeAvailable` 5 | * and `updateVideoSourceSubscriptions` as they are used as keys in maps that may be updated. 6 | * I.e. when setting up a map for `updateVideoSourceSubscriptions` do not construct RemoteVideoSource yourselves 7 | * or the configuration may or may not be updated. 8 | * 9 | * @property attendeeId: [String] - The attendee ID this video tile belongs to. Note that screen share video will have a suffix of #content 10 | */ 11 | class RemoteVideoSource(val attendeeId: String) 12 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoContentHint.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoContentHint] describes the content type of a video source so that downstream encoders, etc. can properly 10 | * decide on what parameters will work best. These options mirror https://www.w3.org/TR/mst-content-hint/ . 11 | */ 12 | enum class VideoContentHint { 13 | /** 14 | * No hint has been provided. 15 | */ 16 | None, 17 | 18 | /** 19 | * The track should be treated as if it contains video where motion is important. 20 | * 21 | * This is normally webcam video, movies or video games. 22 | */ 23 | Motion, 24 | 25 | /** 26 | * The track should be treated as if video details are extra important. 27 | * 28 | * This is generally applicable to presentations or web pages with text content, painting or line art. 29 | */ 30 | Detail, 31 | 32 | /** 33 | * The track should be treated as if video details are extra important, and that 34 | * significant sharp edges and areas of consistent color can occur frequently. 35 | * 36 | * This is generally applicable to presentations or web pages with text content. 37 | */ 38 | Text 39 | } 40 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoPauseState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoPauseState] describes the pause status of a video tile. 10 | */ 11 | enum class VideoPauseState(val value: Int) { 12 | /** 13 | * The video tile is not paused 14 | */ 15 | Unpaused(0), 16 | 17 | /** 18 | * The video tile has been paused by the user, and will only be unpaused if the user requests it to resume. 19 | */ 20 | PausedByUserRequest(1), 21 | 22 | /** 23 | * The video tile has been paused to save on local downlink bandwidth. When the connection improves, 24 | * it will be automatically unpaused by the client. User requested pauses will shadow this pause, 25 | * but if the connection has not recovered on resume the tile will still be paused with this state. 26 | */ 27 | PausedForPoorConnection(2); 28 | 29 | companion object { 30 | fun from(intValue: Int): VideoPauseState? = values().find { it.value == intValue } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoPriority.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | /** 4 | * Enum defining video priority for remote video sources. The 'higher' the number the 'higher' the priority for the source when adjusting video quality 5 | * to adapt to variable network conditions, i.e. `Highest` will be chosen before `High`, `Medium`, etc. 6 | */ 7 | enum class VideoPriority(val value: Int) { 8 | Lowest(0), 9 | Low(10), 10 | Medium(20), 11 | High(30), 12 | Highest(40); 13 | } 14 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoRenderView.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoRenderView] is the type of VideoSink used by the [VideoTileController] 10 | */ 11 | interface VideoRenderView : VideoSink 12 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoResolution.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | /** 4 | * Customizable video resolution parameters for a remote video source. 5 | */ 6 | enum class VideoResolution(val width: Int, val height: Int) { 7 | Low(360, 240), 8 | Medium(640, 480), 9 | High(960, 720), 10 | Disabled(0, 0), 11 | VideoResolutionHD(1280, 720), 12 | VideoResolutionFHD(1920, 1080), 13 | VideoResolutionUHD(3840, 2160), 14 | } 15 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoRotation.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoRotation] describes the rotation of the video frame buffer in degrees clockwise 10 | * from intended viewing horizon. 11 | * 12 | * e.g. If you were recording camera capture upside down relative to 13 | * the orientation of the sensor, this value would be [VideoRotation.Rotation180]. 14 | */ 15 | enum class VideoRotation(val degrees: Int) { 16 | /** 17 | * Not rotated 18 | */ 19 | Rotation0(0), 20 | 21 | /** 22 | * Rotated 90 degrees clockwise 23 | */ 24 | Rotation90(90), 25 | 26 | /** 27 | * Rotated 180 degrees clockwise 28 | */ 29 | Rotation180(180), 30 | 31 | /** 32 | * Rotated 270 degrees clockwise 33 | */ 34 | Rotation270(270); 35 | 36 | companion object { 37 | fun from(intValue: Int): VideoRotation? = values().find { it.degrees == intValue } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoScalingType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoScalingType] describes the scaling type of how video is rendered. Certain types 10 | * may effect how much of a video is cropped. [visibleFraction] refers to the minimum amount 11 | * of a video frame required to be shown per scaling type (e.g. [AspectFit] indicates showing 12 | * the whole frame, no cropping). 13 | */ 14 | enum class VideoScalingType(val visibleFraction: Float) { 15 | /** 16 | * Fit the frame to the surrounding view to avoid any cropping. 17 | */ 18 | AspectFit(1.0f), 19 | 20 | /** 21 | * Attempt to avoid cropping seen using [AspectFill] while showing more 22 | * of the image then [AspectFit]; this may crop if the aspect ratios do not match. 23 | */ 24 | AspectBalanced(0.5625f), 25 | 26 | /** 27 | * Fill the surrounding view; this may crop if the aspect ratios do not match. 28 | */ 29 | AspectFill(0.0f) 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoSink.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * A [VideoSink] consumes video frames, typically from a [VideoSource]. It may process, fork, or render these frames. 10 | * Typically connected via [VideoSource.addVideoSink] and disconnected via [VideoSource.removeVideoSink] 11 | */ 12 | interface VideoSink { 13 | /** 14 | * Receive a video frame from some upstream source. 15 | * The [VideoSink] may render, store, process, and forward the frame, among other applications. 16 | * 17 | * @param frame: [VideoFrame] - New video frame to consume 18 | */ 19 | fun onVideoFrameReceived(frame: VideoFrame) 20 | } 21 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoFacade 9 | 10 | /** 11 | * [VideoSource] is an interface for sources which produce video frames, and can send to a [VideoSink]. 12 | * Implementations can be passed to the [AudioVideoFacade] to be used as the video source sent to remote 13 | * participants 14 | */ 15 | interface VideoSource { 16 | /** 17 | * Add a video sink which will immediately begin to receive new frames. 18 | * 19 | * Multiple sinks can be added to a single [VideoSource] to allow forking of video frames, 20 | * e.g. to send to both local preview and AmazonChimeSDKMedia library (for encoding) at the same time. 21 | * 22 | * @param sink: [VideoSink] - New video sink 23 | */ 24 | fun addVideoSink(sink: VideoSink) 25 | 26 | /** 27 | * Remove a video sink which will no longer receive new frames on return 28 | * 29 | * @param sink: [VideoSink] - Video sink to remove 30 | */ 31 | fun removeVideoSink(sink: VideoSink) 32 | 33 | /** 34 | * Content hint for downstream processing 35 | */ 36 | val contentHint: VideoContentHint 37 | } 38 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoSubscriptionConfiguration.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | /** 4 | * Configuration for a specific video source. 5 | * The values are intentionally mutable so that a map of all current configurations can be kept and updated as needed. 6 | * 7 | * VideoSubscriptionConfiguration is used to contain the priority and resolution of 8 | * remote video sources and content share to be received 9 | * @property priority: [VideoPriority] - Relative priority for the subscription. See [VideoPriority] for more information. 10 | * @property targetResolution: [VideoResolution] - A target resolution for the subscription. The actual receive resolution may vary. 11 | */ 12 | class VideoSubscriptionConfiguration(var priority: VideoPriority, var targetResolution: VideoResolution) 13 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoTile.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoTile] is a tile that binds video render view to display the frame into the view. 10 | */ 11 | interface VideoTile : VideoSink { 12 | /** 13 | * State of video tile 14 | */ 15 | var state: VideoTileState 16 | 17 | /** 18 | * View which will be used to render the Video Frame 19 | */ 20 | var videoRenderView: VideoRenderView? 21 | 22 | /** 23 | * Binds the view to the tile. The view needs to be create by the application. 24 | * Once the binding is done, the view will start displaying the video frame automatically 25 | * 26 | * @param videoRenderView: [VideoRenderView] - The view created by application to render the video frame 27 | */ 28 | fun bind(videoRenderView: VideoRenderView?) 29 | 30 | /** 31 | * Unbinds the [videoRenderView] from tile. 32 | */ 33 | fun unbind() 34 | 35 | /** 36 | * Update the pause state of the tile. 37 | */ 38 | fun setPauseState(pauseState: VideoPauseState) 39 | } 40 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoTileController.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | /** 9 | * [VideoTileController] handles rendering/creating of new [VideoTile]. 10 | */ 11 | interface VideoTileController : VideoTileControllerFacade { 12 | /** 13 | * Called whenever there is a new Video frame received for any of the attendee in the meeting 14 | * 15 | * @param frame: [VideoFrame] - A frame of video 16 | * @param videoId: [Int] - Unique id that belongs to video being transmitted 17 | * @param attendeeId: [String] - An id of user who is transmitting current frame 18 | * @param pauseState: [VideoPauseState] - Current pause state of the video being received 19 | */ 20 | fun onReceiveFrame( 21 | frame: VideoFrame?, 22 | videoId: Int, 23 | attendeeId: String?, 24 | pauseState: VideoPauseState 25 | ) 26 | } 27 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoTileFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | interface VideoTileFactory { 9 | /** 10 | * Make a [VideoTile] 11 | * 12 | * @param tileId: Int - Tile ID 13 | * @param attendeeId: String? - Attendee ID 14 | * @param videoStreamContentWidth: Int - Width of video stream content 15 | * @param videoStreamContentHeight: Int - Height of video stream content 16 | * @param isLocalTile: Boolean: Whether the video tile is for the local attendee 17 | * 18 | * @return [VideoTile] to use with [VideoTileController] 19 | */ 20 | fun makeTile( 21 | tileId: Int, 22 | attendeeId: String, 23 | videoStreamContentWidth: Int, 24 | videoStreamContentHeight: Int, 25 | isLocalTile: Boolean 26 | ): VideoTile 27 | } 28 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoTileState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.DefaultModality 9 | import com.amazonaws.services.chime.sdk.meetings.utils.ModalityType 10 | 11 | /** 12 | * Contains properties related to the current state of the [VideoTile] 13 | * 14 | * @property tileId: Int - Unique Id associated with this tile 15 | * @property attendeeId: String - Attendee Id of the user associated with this tile 16 | * @property videoStreamContentWidth: Int - Width of video stream content 17 | * @property videoStreamContentHeight: Int - Height of video stream content 18 | * @property pauseState: VideoPauseState - The current pause state of the tile 19 | * @property isLocalTile: Boolean - Whether the video tile is for the local attendee 20 | */ 21 | data class VideoTileState( 22 | val tileId: Int, 23 | val attendeeId: String, 24 | var videoStreamContentWidth: Int, 25 | var videoStreamContentHeight: Int, 26 | var pauseState: VideoPauseState, 27 | val isLocalTile: Boolean 28 | ) { 29 | /** 30 | * Whether the video tile is from screen share 31 | */ 32 | val isContent: Boolean = DefaultModality(attendeeId).hasModality(ModalityType.Content) 33 | } 34 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/backgroundfilter/ModelShape.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter 7 | 8 | /** 9 | * [ModelShape] Defines the shape of an ML model. This can be used to define the input and 10 | * output shape of an ML model. 11 | * @param height: [Int] The number of pixels associated with the height of the input image, defaults to 256. 12 | * @param width: [Int] The number of pixels associated with the width of the input image, defaults to 144. 13 | * @param modelRangeMin: [Int] The minimum value associated with the model output, defaults to 0. 14 | * @param modelRangeMax: [Int] The maximum value associated with the model output, defaults to 1. 15 | * @param channels: [Int] The number of channels associated with the pixels, defaults to 4 (RGBA). 16 | */ 17 | class ModelShape @JvmOverloads constructor( 18 | var height: Int = 256, 19 | var width: Int = 144, 20 | var modelRangeMin: Int = 0, 21 | var modelRangeMax: Int = 1, 22 | var channels: Int = 4 23 | ) 24 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/backgroundfilter/backgroundblur/BackgroundBlurConfiguration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter.backgroundblur 7 | 8 | /** 9 | * A set of options that can be supplied when creating a background blur video frame processor. 10 | * @param blurStrength: [Float] - Supported range 0 < blurStrength <= 25. 11 | * See https://developer.android.com/reference/android/renderscript/ScriptIntrinsicBlur#setRadius(float). 12 | * Defaults to value of 7.0f. 13 | */ 14 | class BackgroundBlurConfiguration @JvmOverloads constructor(var blurStrength: Float = 7.0f) 15 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/backgroundfilter/backgroundreplacement/BackgroundReplacementConfiguration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.backgroundfilter.backgroundreplacement 7 | 8 | import android.graphics.Bitmap 9 | import android.graphics.Canvas 10 | import android.graphics.Color 11 | import android.graphics.LinearGradient 12 | import android.graphics.Paint 13 | import android.graphics.Shader 14 | 15 | /** 16 | * A set of options that can be supplied when creating a background replacement video frame processor. 17 | * @param image: [Bitmap] - An image to replace video background with. Defaults to shaded blue 18 | * colored image. 19 | */ 20 | class BackgroundReplacementConfiguration @JvmOverloads constructor(var image: Bitmap = createReplacementImage()) 21 | 22 | private fun createReplacementImage(): Bitmap { 23 | val width = 250.0f 24 | val height = 250.0f 25 | val darkBlueColorString = "#000428" 26 | val lightBlueColorString = "#004e92" 27 | val replacementBitmap = 28 | Bitmap.createBitmap(width.toInt(), height.toInt(), Bitmap.Config.ARGB_8888) 29 | val canvas = Canvas(replacementBitmap) 30 | val paint = Paint() 31 | val startColor = Color.parseColor(darkBlueColorString) 32 | val endColor = Color.parseColor(lightBlueColorString) 33 | val linearGradient = 34 | LinearGradient(0.0f, 0.0f, 100.0f, 0.0f, startColor, endColor, Shader.TileMode.CLAMP) 35 | paint.shader = linearGradient 36 | canvas.drawRect(0.0f, 0.0f, width, height, paint) 37 | return replacementBitmap 38 | } 39 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/buffer/VideoFrameBuffer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.buffer 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoFrame 9 | 10 | /** 11 | * [VideoFrameBuffer] is a buffer which contains a single video buffer's raw data. 12 | * Typically owned by a [VideoFrame] which includes additional metadata. 13 | */ 14 | interface VideoFrameBuffer { 15 | /** 16 | * Width of the video frame buffer 17 | */ 18 | val width: Int 19 | 20 | /** 21 | * Height of the video frame buffer 22 | */ 23 | val height: Int 24 | 25 | /** 26 | * Retain the video frame buffer. Use when shared ownership of the buffer 27 | * is desired (e.g. when passing to separate thread), otherwise the frame 28 | * may be spuriously released 29 | */ 30 | fun retain() 31 | 32 | /** 33 | * Release the video frame buffer. Use after frame construction or [release] 34 | * after the frame is no longer needed. Will trigger appropriate release of 35 | * any internally allocated resources. Not using may result in leaks. 36 | */ 37 | fun release() 38 | } 39 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/buffer/VideoFrameRGBABuffer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.buffer 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.RefCountDelegate 9 | import java.nio.ByteBuffer 10 | 11 | /** 12 | * [VideoFrameRGBABuffer] provides an reference counted wrapper of 13 | * an RGBA natively (i.e. in JNI) allocated direct byte buffer. 14 | */ 15 | class VideoFrameRGBABuffer( 16 | override val width: Int, 17 | override val height: Int, 18 | 19 | /** 20 | * RGBA plane data of video frame in memory. This must be a natively allocated direct byte 21 | * buffer so that it can be passed to native code 22 | */ 23 | val data: ByteBuffer, 24 | 25 | /** 26 | * Stride of RGBA plane of video frame 27 | */ 28 | val stride: Int, 29 | 30 | /** 31 | * Callback to trigger when reference count of this buffer reaches 0 (starts as 1). 32 | * Use this to release underlying natively allocated direct byte buffer 33 | */ 34 | releaseCallback: Runnable 35 | ) : VideoFrameBuffer { 36 | private val refCountDelegate = RefCountDelegate(releaseCallback) 37 | 38 | init { 39 | check(data.isDirect) { "Only direct byte buffers are supported" } 40 | } 41 | 42 | override fun retain() = refCountDelegate.retain() 43 | override fun release() = refCountDelegate.release() 44 | } 45 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/CameraCaptureSource.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoFacade 9 | import com.amazonaws.services.chime.sdk.meetings.device.MediaDevice 10 | 11 | /** 12 | * [CameraCaptureSource] is an interface for camera capture sources with additional features 13 | * not covered by [VideoCaptureSource]. 14 | * 15 | * All the APIs here can be called regardless of whether the [AudioVideoFacade] is started or not. 16 | */ 17 | interface CameraCaptureSource : VideoCaptureSource { 18 | /** 19 | * Current camera device. This is only null if the phone/device doesn't have any cameras 20 | * May be called regardless of whether [start] or [stop] has been called. 21 | */ 22 | var device: MediaDevice? 23 | 24 | /** 25 | * Toggle for torch on the current device. Will succeed if current device has access to 26 | * flashlight, otherwise will stay false. May be called regardless of whether [start] or [stop] 27 | * has been called. 28 | */ 29 | var torchEnabled: Boolean 30 | 31 | /** 32 | * Current camera capture format. Actual format may be adjusted to use supported camera formats. 33 | * May be called regardless of whether [start] or [stop] has been called. 34 | */ 35 | var format: VideoCaptureFormat 36 | 37 | /** 38 | * Helper function to switch from front to back cameras or reverse. This also switches from 39 | * any external cameras to the front camera. 40 | */ 41 | fun switchCamera() 42 | } 43 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/CaptureSourceError.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | /** 9 | * [CaptureSourceError] describes an error resulting from a capture source failure 10 | * These can be used to trigger UI, or attempt to restart the capture source. 11 | */ 12 | enum class CaptureSourceError { 13 | /** 14 | * Unknown error, and catch-all for errors not otherwise covered 15 | */ 16 | Unknown, 17 | 18 | /** 19 | * A failure to obtain necessary permission to start video 20 | */ 21 | PermissionError, 22 | 23 | /** 24 | * A failure observed from a system API used for capturing 25 | * e.g. In response to a `CameraDevice.StateCallback().onError` call 26 | */ 27 | SystemFailure, 28 | 29 | /** 30 | * A failure observed during configuration 31 | */ 32 | ConfigurationFailure; 33 | } 34 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/CaptureSourceObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | /** 9 | * [CaptureSourceObserver] observes events resulting from different types of capture devices. Builders 10 | * may desire this input to decide when to show certain UI elements, or to notify users of failure. 11 | */ 12 | interface CaptureSourceObserver { 13 | /** 14 | * Called when the capture source has started successfully and has started emitting frames 15 | */ 16 | fun onCaptureStarted() 17 | 18 | /** 19 | * Called when the capture source has stopped when expected. The capture may be in the processed of restarting, 20 | * e.g. this may occur when switching cameras. 21 | */ 22 | fun onCaptureStopped() 23 | 24 | /** 25 | * Called when the capture source failed unexpectedly. This may be due to misconfiguration 26 | * or Android system error, and the capture source may be in an unknown state. 27 | * 28 | * This does not necessarily indicate that calling [VideoCaptureSource.start] again will fail. 29 | * 30 | * @param error: [CaptureSourceError] - The reason why the source has stopped. 31 | */ 32 | fun onCaptureFailed(error: CaptureSourceError) 33 | } 34 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/DefaultSurfaceTextureCaptureSourceFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoContentHint 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl.EglCoreFactory 10 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger 11 | 12 | /** 13 | * [DefaultSurfaceTextureCaptureSourceFactory] creates [DefaultSurfaceTextureCaptureSource] objects 14 | */ 15 | class DefaultSurfaceTextureCaptureSourceFactory( 16 | private val logger: Logger, 17 | private val eglCoreFactory: EglCoreFactory 18 | ) : SurfaceTextureCaptureSourceFactory { 19 | override fun createSurfaceTextureCaptureSource( 20 | width: Int, 21 | height: Int, 22 | contentHint: VideoContentHint 23 | ): SurfaceTextureCaptureSource { 24 | check(width >= 0 && height >= 0) { "Width and height must be positive" } 25 | return DefaultSurfaceTextureCaptureSource( 26 | logger, 27 | width, 28 | height, 29 | contentHint, 30 | eglCoreFactory 31 | ) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/SurfaceTextureCaptureSourceFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoContentHint 9 | 10 | /** 11 | * [SurfaceTextureCaptureSourceFactory] is an factory interface for creating new [SurfaceTextureCaptureSource] objects, 12 | * possible using shared state. This provides flexibility over use of [SurfaceTextureCaptureSource] objects since 13 | * they may not allow reuse, or may have a delay before possible reuse. 14 | */ 15 | interface SurfaceTextureCaptureSourceFactory { 16 | /** 17 | * Create a new [SurfaceTextureCaptureSource] object 18 | * 19 | * @return [SurfaceTextureCaptureSource] - Newly created and initialized [SurfaceTextureCaptureSource] object 20 | */ 21 | fun createSurfaceTextureCaptureSource( 22 | width: Int, 23 | height: Int, 24 | contentHint: VideoContentHint 25 | ): SurfaceTextureCaptureSource 26 | } 27 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/capture/VideoCaptureFormat.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture 7 | 8 | /** 9 | * [VideoCaptureFormat] describes a given capture format that can be set to a [VideoCaptureSource]. 10 | * Note that [VideoCaptureSource] implementations may ignore or adjust unsupported values. 11 | */ 12 | data class VideoCaptureFormat( 13 | /** 14 | * Capture width 15 | */ 16 | val width: Int, 17 | 18 | /** 19 | * Capture height 20 | */ 21 | val height: Int, 22 | 23 | /** 24 | * Max FPS. When used as input this implies the desired FPS as well 25 | */ 26 | val maxFps: Int 27 | ) { 28 | init { 29 | check(width >= 0 && height >= 0) { "Width and height must be positive" } 30 | } 31 | 32 | override fun toString(): String { 33 | return "$width x $height @ $maxFps FPS" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/gl/EglCore.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl 7 | 8 | import android.opengl.EGL14 9 | import android.opengl.EGLConfig 10 | import android.opengl.EGLContext 11 | import android.opengl.EGLDisplay 12 | import android.opengl.EGLSurface 13 | 14 | /** 15 | * [EglCore] is an interface for containing all EGL state in one component. In the future it may contain additional helper methods. 16 | */ 17 | interface EglCore { 18 | /** 19 | * A [EGLContext] which was created with [eglDisplay] and [eglConfig], may or may not be the current context on the thread, users 20 | * must call [EGL14.eglMakeCurrent] after creating a valid current surface. This may be passed to other components to share the context. 21 | */ 22 | val eglContext: EGLContext 23 | 24 | /** 25 | * Current initialized [EGLDisplay] 26 | */ 27 | val eglDisplay: EGLDisplay 28 | 29 | /** 30 | * Current used [EGLConfig] 31 | */ 32 | val eglConfig: EGLConfig 33 | 34 | /** 35 | * Current [EGLSurface]. Will likely be [EGL14.EGL_NO_SURFACE] on init. As [EglCore] does not include helper functions 36 | * users must create this value themselves, which is why it is defined as `var` 37 | */ 38 | var eglSurface: EGLSurface 39 | 40 | /** 41 | * Discards all resources held by this class, notably the EGL context. This must be 42 | * called from the thread where the context was created. 43 | * 44 | * On completion, no context will be current. 45 | */ 46 | fun release() 47 | } 48 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/gl/EglCoreFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl 7 | 8 | /** 9 | * [EglCoreFactory] is an factory interface for creating new [EglCore] objects, possible using shared state 10 | */ 11 | interface EglCoreFactory { 12 | /** 13 | * Create a new [EglCore] object 14 | * 15 | * @return [EglCore] - Newly created and initialized [EglCore] object 16 | */ 17 | fun createEglCore(): EglCore 18 | } 19 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/gl/EglVideoRenderView.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video.gl 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoRenderView 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoTileController 10 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.buffer.VideoFrameTextureBuffer 11 | 12 | /** 13 | * [EglVideoRenderView] is a [VideoRenderView] which requires EGL initialization to render [VideoFrameTextureBuffer] buffers. 14 | * The [VideoTileController] should automatically manage ([init] and [release]) any bound tiles, but if it 15 | * is desired to use a view outside of the controller (e.g. in pre-meeting device selection), users will 16 | * need to call [init] and [release] themselves 17 | */ 18 | interface EglVideoRenderView : VideoRenderView { 19 | /** 20 | * Initialize view with factory to create [EglCore] objects to hold/share EGL state 21 | * 22 | * @param eglCoreFactory: [EglCoreFactory] - Factory to create [EglCore] objects to hold EGL state 23 | */ 24 | fun init(eglCoreFactory: EglCoreFactory) 25 | 26 | /** 27 | * Deallocate any state or resources held by this object 28 | */ 29 | fun release() 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/device/DeviceChangeObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.device 7 | 8 | /** 9 | * [DeviceChangeObserver] listens audio device changes. 10 | * 11 | * Note: all callbacks will be called on main thread. 12 | */ 13 | interface DeviceChangeObserver { 14 | /** 15 | * Called when audio devices are changed. 16 | * 17 | * Note: this callback will be called on main thread. 18 | * 19 | * @param freshAudioDeviceList: List<[MediaDevice]> - An updated list of audio devices. 20 | */ 21 | fun onAudioDeviceChanged(freshAudioDeviceList: List) 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/EventBuffer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.ingestion.SDKEvent 9 | 10 | /** 11 | * [EventBuffer] defines a buffer which will consume the [SDKEvent] internally. 12 | */ 13 | interface EventBuffer { 14 | /** 15 | * Add a meeting event to the buffer. 16 | * 17 | * @param item: [SDKEvent] - meeting event 18 | */ 19 | fun add(item: SDKEvent) 20 | 21 | /** 22 | * Consume the data. 23 | */ 24 | fun process() 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/EventClientConfiguration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | /** 9 | * [EventClientType] defines the type of event client configuration that will be 10 | * sent to the server. 11 | */ 12 | enum class EventClientType { 13 | /** 14 | * Meeting related type 15 | */ 16 | Meet 17 | } 18 | 19 | /** 20 | * [EventClientConfiguration] defines core properties needed for every event client configuration. 21 | */ 22 | interface EventClientConfiguration { 23 | /** 24 | * type: [EventClientType] - type of [EventClientConfiguration] 25 | */ 26 | val type: EventClientType 27 | 28 | /** 29 | * eventClientJoinToken: [String] - authentication token needed for ingestion url 30 | */ 31 | val eventClientJoinToken: String 32 | 33 | /** 34 | * tag: [String] - tagging the source of the events, which will be translated to Type for Ingestion Event 35 | */ 36 | val tag: String 37 | 38 | /** 39 | * metadataAttributes: [Map] - the attributes that will be sent to Ingestion Service as metadata 40 | */ 41 | val metadataAttributes: Map 42 | } 43 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/EventReporter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.ingestion.SDKEvent 9 | 10 | /** 11 | * [EventReporter] is class that process meeting event that is created in [EventAnalyticsController]. 12 | */ 13 | interface EventReporter { 14 | /** 15 | * Report the meeting event 16 | * 17 | * @param event: [SDKEvent] - Event that has name and attributes associated. 18 | */ 19 | fun report(event: SDKEvent) 20 | 21 | /** 22 | * Start [EventReporter] and process data 23 | */ 24 | fun start() 25 | 26 | /** 27 | * Stop [EventReporter] and processing data 28 | */ 29 | fun stop() 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/EventReporterFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | /** 9 | * [EventReporterFactory] facilitates creating [EventReporter] 10 | */ 11 | interface EventReporterFactory { 12 | /** 13 | * Create [EventReporter] and return null if no-op is needed on event reporting. 14 | * 15 | * @return [EventReporter] - event reporter created. 16 | */ 17 | fun createEventReporter(): EventReporter? 18 | } 19 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/EventSender.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | /** 9 | * [EventSender] is responsible for sending [IngestionRecord]. 10 | */ 11 | interface EventSender { 12 | /** 13 | * Send ingestion record. 14 | * 15 | * @param record: [IngestionRecord] - record to send 16 | * @return whether sending was successful or not. 17 | */ 18 | suspend fun sendRecord(record: IngestionRecord): Boolean 19 | } 20 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/IngestionEvent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | import com.google.gson.annotations.SerializedName 9 | 10 | typealias IngestionPayload = Map 11 | 12 | /** 13 | * [IngestionEvent] defines the event format ingestion server will accept 14 | * 15 | * @property type: [EventClientType] - type of Event. 16 | * @property payloads: [List] - list of map that contains details of event 17 | * @property version: [Int] - version of this event. If the format changes, it will have different version. 18 | */ 19 | data class IngestionEvent( 20 | val type: String, 21 | val metadata: IngestionMetadata, 22 | val payloads: List, 23 | @SerializedName("v") 24 | val version: Int = 1 25 | ) 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/MeetingEventClientConfiguration.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventAttributeName 9 | 10 | /** 11 | * [MeetingEventClientConfiguration] defines one type of [EventClientConfiguration] 12 | * that is needed for [DefaultEventReporter] 13 | * 14 | * @property eventClientJoinToken: [String] - an authorization token to send 15 | * @property meetingId: [String] - meeting id 16 | * @property attendeeId: [String] - attendee id 17 | */ 18 | data class MeetingEventClientConfiguration( 19 | override val eventClientJoinToken: String, 20 | val meetingId: String, 21 | val attendeeId: String 22 | ) : EventClientConfiguration { 23 | override val type: EventClientType = EventClientType.Meet 24 | 25 | override val tag: String = "Meet" 26 | override val metadataAttributes: Map = 27 | mapOf( 28 | EventAttributeName.meetingId.name to meetingId, 29 | EventAttributeName.attendeeId.name to attendeeId 30 | ) 31 | } 32 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/ingestion/NoopEventReporterFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | /** 9 | * [NoopEventReporterFactory] returns null [EventReporter] 10 | */ 11 | class NoopEventReporterFactory : EventReporterFactory { 12 | override fun createEventReporter(): EventReporter? { 13 | return null 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/AttendeeStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal 7 | 8 | /** 9 | * [AttendeeStatus] describes status of Attendee - Join, Leave, Drop 10 | */ 11 | enum class AttendeeStatus(val value: Int) { 12 | /** 13 | * The attendee joined 14 | */ 15 | Joined(1), 16 | 17 | /** 18 | * The attendee left 19 | */ 20 | Left(2), 21 | 22 | /** 23 | * The attendee dropped due to network 24 | */ 25 | Dropped(3); 26 | 27 | companion object { 28 | fun from(intValue: Int): AttendeeStatus? = values().find { it.value == intValue } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/SessionStateControllerAction.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal 7 | 8 | /** 9 | * [SessionStateControllerAction] is a state-changing action to perform. 10 | */ 11 | enum class SessionStateControllerAction(val value: Int) { 12 | Unknown(-1), 13 | Init(0), 14 | Connecting(1), 15 | FinishConnecting(2), 16 | Updating(3), 17 | FinishUpdating(4), 18 | Reconnecting(5), 19 | Disconnecting(6), 20 | FinishDisconnecting(7), 21 | Fail(8); 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/audio/AudioClientFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.audio 7 | 8 | import android.content.Context 9 | import com.xodee.client.audio.audioclient.AudioClient 10 | 11 | class AudioClientFactory private constructor( 12 | context: Context, 13 | audioClientObserver: AudioClientObserver 14 | ) { 15 | private val audioClient: AudioClient 16 | 17 | init { 18 | System.loadLibrary("c++_shared") 19 | System.loadLibrary("amazon_chime_media_client") 20 | audioClient = AudioClient( 21 | context.assets, 22 | audioClientObserver, 23 | audioClientObserver, 24 | audioClientObserver, 25 | audioClientObserver, 26 | audioClientObserver, 27 | audioClientObserver, 28 | audioClientObserver, 29 | audioClientObserver, 30 | 0 31 | ) 32 | } 33 | 34 | companion object { 35 | fun getAudioClient( 36 | context: Context, 37 | audioClientObserver: AudioClientObserver 38 | ): AudioClient { 39 | return AudioClientFactory( 40 | context, 41 | audioClientObserver 42 | ).audioClient 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/audio/AudioClientState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.audio 7 | 8 | /** 9 | * The current state of the Audio Client. Used by [AudioClientController] 10 | * to determine if actions are allowed based on current state. 11 | */ 12 | enum class AudioClientState(val value: Int) { 13 | INITIALIZED(0), 14 | STARTED(1), 15 | STOPPED(2), 16 | } 17 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/contentshare/ContentShareVideoClientObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.contentshare 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.contentshare.ContentShareObserver 9 | import com.xodee.client.video.VideoClientDelegate 10 | import com.xodee.client.video.VideoClientLogListener 11 | 12 | /** 13 | * [ContentShareVideoClientObserver] handles all callbacks related to the separate video client 14 | * for content share and allows higher level components to observe the lower level Video Client events. 15 | */ 16 | interface ContentShareVideoClientObserver : VideoClientDelegate, VideoClientLogListener { 17 | 18 | /** 19 | * Subscribe to video client state and connection events with an [ContentShareObserver] 20 | * 21 | * @param observer: [ContentShareObserver] - The observer to subscribe to events with. 22 | */ 23 | fun subscribeToVideoClientStateChange(observer: ContentShareObserver) 24 | 25 | /** 26 | * Unsubscribe from video client state and connection events by removing the specified [ContentShareObserver] 27 | * 28 | * @param observer: [ContentShareObserver] - The observer to unsubscribe from events with. 29 | */ 30 | fun unsubscribeFromVideoClientStateChange(observer: ContentShareObserver) 31 | } 32 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/DirtyEventDao.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion 7 | 8 | interface DirtyEventDao { 9 | /** 10 | * List dirty meeting events items which includes all the fields in the table. 11 | * 12 | * @param size: [Int] - size to query 13 | * @return list of dirty meeting event items from database 14 | */ 15 | fun listDirtyMeetingEventItems(size: Int): List 16 | 17 | /** 18 | * Delete dirty events by given ids. 19 | * 20 | * @param ids: [List] - ids of dirty events 21 | * @return number of events removed or -1 if delete failed 22 | */ 23 | fun deleteDirtyEventsByIds(ids: List): Int 24 | 25 | /** 26 | * Insert multiple dirty meeting events. 27 | * 28 | * @param dirtyEvents: [List] - List of DirtyMeetingEventItem 29 | * @return whether insertion was successful or not 30 | */ 31 | fun insertDirtyMeetingEventItems(dirtyEvents: List): Boolean 32 | } 33 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/DirtyMeetingEventItem.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion 7 | 8 | import java.util.UUID 9 | 10 | /** 11 | * [DirtyMeetingEventItem] is a data type of an entry inside DirtyEvents Sqlite table. 12 | * 13 | * @property id unique id of the database entry 14 | * @property data data/meeting event associated with the entry 15 | * @property ttl lifetime of that entry that will be checked when ingestion service runs 16 | */ 17 | data class DirtyMeetingEventItem( 18 | val id: String = UUID.randomUUID().toString(), 19 | val data: SDKEvent, 20 | val ttl: Long 21 | ) 22 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/EventDao.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion 7 | 8 | interface EventDao { 9 | /** 10 | * List meeting events items which includes all the fields in the table. 11 | * 12 | * @param size: [Int] - size of events to list 13 | * @return list of [MeetingEventItem] 14 | */ 15 | fun listMeetingEventItems(size: Int): List 16 | 17 | /** 18 | * Delete meeting events by given ids. 19 | * 20 | * @param ids: [List] - list of ids to remove 21 | * @return number of events removed or -1 if delete failed 22 | */ 23 | fun deleteMeetingEventsByIds(ids: List): Int 24 | 25 | /** 26 | * Insert a meeting event item. 27 | * 28 | * @param event: [MeetingEventItem] - meeting event to insert 29 | * @return whether insertion is successful or not 30 | */ 31 | fun insertMeetingEvent(event: MeetingEventItem): Boolean 32 | } 33 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/MeetingEventItem.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion 7 | 8 | import java.util.UUID 9 | 10 | /** 11 | * [MeetingEventItem] is a data type of an entry inside Events SQLite table. 12 | * 13 | * @property id unique id of the database entry 14 | * @property data data/meeting event associated with the entry 15 | */ 16 | data class MeetingEventItem( 17 | val id: String = UUID.randomUUID().toString(), 18 | val data: SDKEvent 19 | ) 20 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/SDKEvent.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventAttributes 9 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventName 10 | import com.amazonaws.services.chime.sdk.meetings.analytics.MeetingHistoryEventName 11 | import com.amazonaws.services.chime.sdk.meetings.analytics.toStringKeyMap 12 | 13 | class SDKEvent( 14 | val name: String, 15 | val eventAttributes: Map 16 | ) { 17 | constructor(eventName: EventName, eventAttributes: EventAttributes) : this(eventName.name, eventAttributes.toStringKeyMap()) 18 | constructor(eventName: MeetingHistoryEventName, eventAttributes: EventAttributes) : this(eventName.name, eventAttributes.toStringKeyMap()) 19 | 20 | fun putAttributes(attributes: Map): SDKEvent { 21 | val updatedEventAttributes = eventAttributes.toMutableMap() 22 | updatedEventAttributes.putAll(attributes) 23 | return SDKEvent(name, updatedEventAttributes) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/ingestion/database/DatabaseTable.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.ingestion.database 7 | 8 | /** 9 | * Database Table that defines the columns and the primary key. 10 | * Currently foreign keys are not supported. 11 | * Only single primary key is supported. 12 | */ 13 | interface DatabaseTable { 14 | /** 15 | * Name of database table. 16 | */ 17 | val tableName: String 18 | 19 | /** 20 | * Columns other than primary keys. 21 | * Key would be column name and value would be type. 22 | * For example, mapOf("data" to "TEXT") 23 | */ 24 | val columns: Map 25 | 26 | /** 27 | * A primary key for the database 28 | */ 29 | val primaryKey: Pair 30 | } 31 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/BackOffRetry.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | interface BackOffRetry { 9 | fun calculateBackOff(): Long 10 | fun getRetryCount(): Int 11 | fun isRetryCountLimitReached(): Boolean 12 | fun incrementRetryCount() 13 | fun isRetryableCode(responseCode: Int): Boolean 14 | } 15 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/ConcurrentSet.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import java.util.Collections 9 | import java.util.concurrent.ConcurrentHashMap 10 | 11 | class ConcurrentSet { 12 | companion object { 13 | fun createConcurrentSet(): MutableSet { 14 | return Collections.newSetFromMap(ConcurrentHashMap()) 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/DefaultBackOffRetry.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import kotlin.math.pow 9 | 10 | class DefaultBackOffRetry( 11 | private val maxRetry: Int = 0, 12 | private val backOff: Long = 0, 13 | private val retryableStatusCodes: Set = HashSet() 14 | ) : BackOffRetry { 15 | private val multiplier = 1 16 | private var currentRetry = 0 17 | 18 | override fun calculateBackOff(): Long { 19 | return (backOff * multiplier.toDouble().pow(currentRetry.toDouble())).toLong() 20 | } 21 | 22 | override fun getRetryCount(): Int { 23 | return currentRetry 24 | } 25 | 26 | override fun isRetryCountLimitReached(): Boolean { 27 | return maxRetry > currentRetry 28 | } 29 | 30 | override fun incrementRetryCount() { 31 | currentRetry++ 32 | } 33 | 34 | override fun isRetryableCode(responseCode: Int): Boolean { 35 | return retryableStatusCodes.isEmpty() || retryableStatusCodes.contains(responseCode) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/DeviceUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.Versioning 9 | import com.biba.android.MediaClient.BuildConfig 10 | 11 | /** 12 | * [DeviceUtils] stores general device/SDK information 13 | */ 14 | class DeviceUtils { 15 | companion object { 16 | val sdkName: String by lazy { 17 | "amazon-chime-sdk-android" 18 | } 19 | val sdkVersion: String by lazy { 20 | Versioning.sdkVersion() 21 | } 22 | 23 | val deviceModel: String? by lazy { 24 | android.os.Build.MODEL 25 | } 26 | 27 | val deviceManufacturer: String? by lazy { 28 | android.os.Build.MANUFACTURER 29 | } 30 | 31 | val deviceName: String by lazy { 32 | "${android.os.Build.MANUFACTURER} ${android.os.Build.MODEL}" 33 | } 34 | 35 | val osName: String by lazy { 36 | "Android" 37 | } 38 | val osVersion: String? by lazy { 39 | android.os.Build.VERSION.RELEASE 40 | } 41 | 42 | val mediaSDKVersion: String by lazy { 43 | BuildConfig.VERSION_NAME 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/HttpException.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | data class HttpException(val errorCode: Int? = null, val errorReason: String? = "") : 9 | Exception() 10 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/HttpResponse.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | data class HttpResponse(val data: String? = null, val httpException: HttpException? = null) 9 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/JsonUtils.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 2 | 3 | import com.google.gson.Gson 4 | 5 | class JsonUtils { 6 | companion object { 7 | private val gson = Gson() 8 | 9 | fun marshal(data: Any): String { 10 | return gson.toJson(data) 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/ObserverUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import kotlinx.coroutines.CoroutineScope 9 | import kotlinx.coroutines.Dispatchers 10 | import kotlinx.coroutines.launch 11 | 12 | /** 13 | * [ObserverUtils] are util functions that can be used with observers. 14 | */ 15 | class ObserverUtils { 16 | companion object { 17 | private val uiScope = CoroutineScope(Dispatchers.Main) 18 | /** 19 | * Run observer methods on main thread 20 | * 21 | * @param observers: Set - Set of observers 22 | * @param observerFunction: (observer: T) -> Unit - function to be executed with observer 23 | */ 24 | fun notifyObserverOnMainThread(observers: Set, observerFunction: (observer: T) -> Unit) { 25 | uiScope.launch { 26 | for (observer in observers) { 27 | observerFunction(observer) 28 | } 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TimezoneUtils.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import java.util.GregorianCalendar 9 | import java.util.TimeZone 10 | 11 | class TimezoneUtils { 12 | companion object { 13 | private const val UTC_OFFSET_FORMAT = "%02d:%02d" 14 | 15 | /** 16 | * Return utc offset from timezone in +-hh:mm format. 17 | * E.g Asia/Calcutta timezone is returned as +05:30 UTC offset 18 | */ 19 | fun getUtcOffset(timezone: TimeZone): String { 20 | val offsetMillis = timezone.getOffset(GregorianCalendar.getInstance(timezone).timeInMillis) 21 | val offsetHours = Math.abs((offsetMillis / 60000) / 60) 22 | val offsetMinutes = Math.abs((offsetMillis / 60000) % 60) 23 | var offset: String = String.format(UTC_OFFSET_FORMAT, offsetHours, offsetMinutes) 24 | offset = (if (offsetMillis >= 0) "+" else "-") + offset 25 | return offset 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/DefaultVideoClientFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.contentshare.ContentShareVideoClientObserver 9 | import com.xodee.client.video.VideoClient 10 | import com.xodee.client.video.VideoClientDataMessageListener 11 | 12 | class DefaultVideoClientFactory : VideoClientFactory { 13 | override fun getVideoClient(videoClientObserver: VideoClientObserver): VideoClient { 14 | return VideoClient(videoClientObserver, videoClientObserver, videoClientObserver) 15 | } 16 | 17 | override fun getVideoClient(contentShareVideoClientObserver: ContentShareVideoClientObserver): VideoClient { 18 | return VideoClient( 19 | contentShareVideoClientObserver, 20 | contentShareVideoClientObserver, 21 | VideoClientDataMessageListener { Unit } 22 | ) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNCredentials.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | /** 9 | * The credentials needed for TURN. Obtained by making a turn request with [TURNRequestParams]. 10 | */ 11 | data class TURNCredentials( 12 | val username: String, 13 | val password: String, 14 | val ttl: String, 15 | val uris: Array 16 | ) { 17 | companion object { 18 | const val TURN_CREDENTIALS_RESULT_USERNAME = "username" 19 | const val TURN_CREDENTIALS_RESULT_PASSWORD = "password" 20 | const val TURN_CREDENTIALS_RESULT_URIS = "uris" 21 | const val TURN_CREDENTIALS_RESULT_TTL = "ttl" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/TURNRequestParams.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | /** 9 | * Data needed to make a request for [TURNCredentials]. 10 | */ 11 | data class TURNRequestParams( 12 | val meetingId: String, 13 | val signalingUrl: String, 14 | val turnControlUrl: String, 15 | val joinToken: String 16 | ) 17 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/VideoClientFactory.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.contentshare.ContentShareVideoClientObserver 9 | import com.xodee.client.video.VideoClient 10 | 11 | interface VideoClientFactory { 12 | /** 13 | * Get a [VideoClient] 14 | * 15 | * @param videoClientObserver: [VideoClientObserver] - observer for video client 16 | */ 17 | fun getVideoClient(videoClientObserver: VideoClientObserver): VideoClient 18 | 19 | /** 20 | * Get a [VideoClient] 21 | * 22 | * @param contentShareVideoClientObserver: [ContentShareVideoClientObserver] - observer for video client 23 | */ 24 | fun getVideoClient(contentShareVideoClientObserver: ContentShareVideoClientObserver): VideoClient 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/VideoClientLifecycleHandler.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | /** 9 | * Allows a component to respond to lifecycle events from [VideoClientStateController]. 10 | */ 11 | interface VideoClientLifecycleHandler { 12 | /** 13 | * Lifecycle event for initializing video client. 14 | */ 15 | fun initializeVideoClient() 16 | 17 | /** 18 | * Lifecycle event for starting video client. 19 | */ 20 | fun startVideoClient() 21 | 22 | /** 23 | * Lifecycle event for stopping video client. 24 | */ 25 | fun stopVideoClient() 26 | 27 | /** 28 | * Lifecycle event for destroying video client. 29 | */ 30 | fun destroyVideoClient() 31 | } 32 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/VideoClientState.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video 7 | 8 | /** 9 | * The current state of the Video Client. Used by [VideoClientStateController] for lifecycle methods 10 | * and to determine if [VideoClientController] actions are allowed based on current state. 11 | */ 12 | enum class VideoClientState(val value: Int) { 13 | UNINITIALIZED(-1), 14 | INITIALIZED(0), 15 | STOPPED(0), 16 | STARTED(1), 17 | } 18 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/gl/GlVideoFrameDrawer.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video.gl 7 | 8 | import android.graphics.Matrix 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoFrame 10 | 11 | /** 12 | * [GlVideoFrameDrawer] is a interface for implementing the drawing of video frames and supported buffers to the current EGL surface 13 | */ 14 | interface GlVideoFrameDrawer { 15 | /** 16 | * Draw a [VideoFrame] to the current EGL surface using the provided viewport and matrix. 17 | * [additionalRenderMatrix] will be applied on top of any matrices attached to the video frame buffer. 18 | * The resulting draw will have the rotation and any internal transform matrices applied. 19 | * 20 | * @param frame: [VideoFrame] - Video frame to draw 21 | * @param viewportX: [Int] - X coordinate of target viewport 22 | * @param viewportY: [Int] - Y coordinate of target viewport 23 | * @param viewportWidth: [Int] - Width of target viewport 24 | * @param viewportHeight: [Int] - Height of target viewport 25 | * @param additionalRenderMatrix: [Matrix?] - Additional matrix to apply to frame 26 | */ 27 | fun drawFrame( 28 | frame: VideoFrame, 29 | viewportX: Int, 30 | viewportY: Int, 31 | viewportWidth: Int, 32 | viewportHeight: Int, 33 | additionalRenderMatrix: Matrix? 34 | ) 35 | 36 | /** 37 | * Deallocate any state or resources held by this object 38 | */ 39 | fun release() 40 | } 41 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/internal/video/gl/ShareEglLock.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.video.gl 7 | 8 | /** 9 | * [ShareEglLock] is to synchronizes the EGL operations. The main motivation is to avoid crashes 10 | * due to missing frames during rendering from race condition. 11 | */ 12 | class ShareEglLock { 13 | companion object { 14 | val Lock = object {} 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/realtime/TranscriptEventObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.realtime 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.TranscriptEvent 9 | 10 | /** 11 | * [TranscriptEventObserver] lets one listen to [TranscriptEvent] events of current meeting 12 | * 13 | * Note: all callbacks will be called on main thread. 14 | */ 15 | interface TranscriptEventObserver { 16 | /** 17 | * Handles receive of transcript event - [TranscriptEvent]. 18 | * 19 | * Note: this callback will be called on main thread. 20 | * 21 | * @param transcriptEvent: Array<[TranscriptEvent]> - Transcript events. 22 | */ 23 | fun onTranscriptEventReceived(transcriptEvent: TranscriptEvent) 24 | } 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/realtime/datamessage/DataMessage.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.realtime.datamessage 7 | 8 | import com.google.gson.Gson 9 | 10 | /** 11 | * Data message received from server. 12 | * 13 | * @property timestampMs: Long - Monotonically increasing server ingest time 14 | * @property topic: String - Topic this message was sent on 15 | * @property data: ByteArray - Data payload 16 | * @property senderAttendeeId - Sender attendee 17 | * @property senderExternalUserId - Sender attendee external user Id 18 | * @property throttled - true if server throttled or rejected message, 19 | * false if server has posted the message to its recipients or it's not a sender receipt 20 | */ 21 | data class DataMessage( 22 | val timestampMs: Long, 23 | val topic: String, 24 | val data: ByteArray, 25 | val senderAttendeeId: String, 26 | val senderExternalUserId: String, 27 | val throttled: Boolean 28 | ) { 29 | 30 | /** 31 | * Helper method to convert ByteArray data to String 32 | * 33 | * @return string data 34 | */ 35 | fun text(): String { 36 | return String(data) 37 | } 38 | 39 | /** 40 | * Helper method to convert ByteArray data to object of given type 41 | * 42 | * @param clazz: Object type 43 | * @return deserialized object 44 | */ 45 | fun fromJson(clazz: Class): T { 46 | return Gson().fromJson(text(), clazz) 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/realtime/datamessage/DataMessageObserver.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.realtime.datamessage 7 | 8 | /** 9 | * [DataMessageObserver] lets one listen to data message receiving event. 10 | * One can subscribe this observer to multiple data message topic in order 11 | * to receive and process the message that sent to the topics. 12 | * 13 | * Note: callback will be called on main thread. 14 | */ 15 | interface DataMessageObserver { 16 | /** 17 | * Handles data message being received. 18 | * 19 | * Note: Data messages sent from local participant will not trigger this callback unless it's throttled. 20 | * 21 | * @param dataMessage: [DataMessage] - data message being received 22 | */ 23 | fun onDataMessageReceived(dataMessage: DataMessage) 24 | } 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/CreateAttendeeResponse.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | // https://docs.aws.amazon.com/chime/latest/APIReference/API_CreateAttendee.html 9 | data class CreateAttendeeResponse(val Attendee: Attendee) 10 | 11 | data class Attendee( 12 | val AttendeeId: String, 13 | val ExternalUserId: String, 14 | val JoinToken: String 15 | ) 16 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSession.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventAnalyticsController 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoFacade 10 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger 11 | 12 | /** 13 | * [MeetingSession] contains everything needed for the attendee to authenticate, 14 | * reach the meeting service, start audio, and start video 15 | */ 16 | interface MeetingSession { 17 | val configuration: MeetingSessionConfiguration 18 | val logger: Logger 19 | val audioVideo: AudioVideoFacade 20 | val eventAnalyticsController: EventAnalyticsController 21 | } 22 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSessionCredentials.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | /** 9 | * [MeetingSessionCredentials] includes the credentials used to authenticate 10 | * the attendee on the meeting 11 | */ 12 | data class MeetingSessionCredentials( 13 | val attendeeId: String, 14 | val externalUserId: String, 15 | val joinToken: String 16 | ) 17 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSessionStatus.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | /** 9 | * [MeetingSessionStatus] indicates a status received regarding the session. 10 | * 11 | * @param statusCode: [MeetingSessionStatusCode] - Additional details for the status 12 | */ 13 | data class MeetingSessionStatus(val statusCode: MeetingSessionStatusCode?) { 14 | constructor(statusCodeValue: Int) : this(MeetingSessionStatusCode.from(statusCodeValue)) 15 | } 16 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSessionURLs.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | /** 9 | * [MeetingSessionURLs] contains the URLs that will be used to reach the 10 | * meeting service. 11 | */ 12 | data class MeetingSessionURLs @JvmOverloads constructor( 13 | private val _audioFallbackURL: String, 14 | private val _audioHostURL: String, 15 | private val _turnControlURL: String, 16 | private val _signalingURL: String, 17 | val urlRewriter: URLRewriter, 18 | private val _ingestionURL: String? = null 19 | ) { 20 | val audioHostURL = urlRewriter(_audioHostURL) 21 | val audioFallbackURL = urlRewriter(_audioFallbackURL) 22 | val turnControlURL = urlRewriter(_turnControlURL) 23 | val signalingURL = urlRewriter(_signalingURL) 24 | val ingestionURL = _ingestionURL?.let { urlRewriter(it) } 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/session/URLRewriter.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | /** 9 | * [URLRewriter] Function to transform URLs. 10 | * Use this to rewrite URLs to traverse proxies. 11 | * @param url: Url string 12 | * @return A new url string manipulated 13 | */ 14 | typealias URLRewriter = (url: String) -> String 15 | 16 | /** 17 | * The default implementation returns the original URL unchanged. 18 | */ 19 | fun defaultUrlRewriter(url: String) = url 20 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/utils/ModalityType.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils 7 | 8 | enum class ModalityType(val value: String) { 9 | Content("content"); 10 | 11 | companion object { 12 | fun fromValue(value: String): ModalityType? = values().find { it.value == value } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/utils/RefCountDelegate.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils 7 | 8 | import java.util.concurrent.atomic.AtomicInteger 9 | 10 | class RefCountDelegate(private val releaseCallback: Runnable) { 11 | private val refCount: AtomicInteger = AtomicInteger(1) 12 | 13 | fun retain() { 14 | val updatedCount: Int = refCount.incrementAndGet() 15 | check(updatedCount >= 2) { "retain() called on an object with refcount < 1" } 16 | } 17 | 18 | fun release() { 19 | val updatedCount: Int = refCount.decrementAndGet() 20 | check(updatedCount >= 0) { "release() called on an object with refcount < 1" } 21 | if (updatedCount == 0) { 22 | releaseCallback.run() 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/utils/Versioning.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils 7 | 8 | import com.amazonaws.services.chime.sdk.BuildConfig 9 | 10 | /** 11 | * [Versioning] provides API to retrieve SDK version 12 | */ 13 | class Versioning { 14 | companion object { 15 | /** 16 | * Return current version of Amazon Chime SDK for Android. 17 | */ 18 | fun sdkVersion(): String { 19 | return BuildConfig.VERSION_NAME 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/utils/logger/LogLevel.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils.logger 7 | 8 | enum class LogLevel(val priority: Int) { 9 | VERBOSE(0), 10 | DEBUG(1), 11 | INFO(2), 12 | WARN(3), 13 | ERROR(4), 14 | OFF(5) 15 | } 16 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/java/com/amazonaws/services/chime/sdk/meetings/utils/logger/Logger.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils.logger 7 | 8 | /** 9 | * [Logger] defines how to write logs for different logging level. 10 | */ 11 | interface Logger { 12 | 13 | /** 14 | * Emits an verbose message if the log level is equal to or lower than verbose level. 15 | */ 16 | fun verbose(tag: String, msg: String) 17 | 18 | /** 19 | * Emits an debug message if the log level is equal to or lower than debug level. 20 | */ 21 | fun debug(tag: String, msg: String) 22 | 23 | /** 24 | * Emits an info message if the log level is equal to or lower than info level. 25 | */ 26 | fun info(tag: String, msg: String) 27 | 28 | /** 29 | * Emits a warning message if the log level is equal to or lower than warn level. 30 | */ 31 | fun warn(tag: String, msg: String) 32 | 33 | /** 34 | * Emits an error message if the log level is equal to or lower than error level. 35 | */ 36 | fun error(tag: String, msg: String) 37 | 38 | /** 39 | * Sets the log level. 40 | */ 41 | fun setLogLevel(level: LogLevel) 42 | 43 | /** 44 | * Gets the current log level. 45 | */ 46 | fun getLogLevel(): LogLevel 47 | } 48 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | amazon-chime-sdk 8 | 9 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/TestConstant.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings 2 | 3 | class TestConstant { 4 | companion object { 5 | const val globalScopeTimeoutMs = 5000L 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/analytics/EventAttributesTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.analytics 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.internal.utils.JsonUtils 9 | import org.junit.Assert 10 | import org.junit.Test 11 | 12 | class EventAttributesTest { 13 | @Test 14 | fun `toJsonString should call JSONUtils marshal function`() { 15 | val attributes = mutableMapOf() 16 | val text = attributes.toJsonString() 17 | 18 | Assert.assertEquals(JsonUtils.marshal(attributes), text) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/AudioDeviceCapabilitiesTest.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio 2 | 3 | import android.Manifest 4 | import org.junit.Test 5 | 6 | class AudioDeviceCapabilitiesTest { 7 | @Test 8 | fun `should not require permissions for None`() { 9 | assert(AudioDeviceCapabilities.None.requiredPermissions().isEmpty()) 10 | } 11 | 12 | @Test 13 | fun `should require MODIFY_AUDIO_SETTINGS permissions for OutputOnly`() { 14 | assert(AudioDeviceCapabilities.OutputOnly.requiredPermissions().contains(Manifest.permission.MODIFY_AUDIO_SETTINGS)) 15 | } 16 | 17 | @Test 18 | fun `should check MODIFY_AUDIO_SETTINGS and RECORD_AUDIO permissions for InputAndOutput`() { 19 | assert(AudioDeviceCapabilities.InputAndOutput.requiredPermissions().contains(Manifest.permission.MODIFY_AUDIO_SETTINGS)) 20 | assert(AudioDeviceCapabilities.InputAndOutput.requiredPermissions().contains(Manifest.permission.RECORD_AUDIO)) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/AudioModeTest.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio 2 | 3 | import org.junit.Assert 4 | import org.junit.Test 5 | 6 | class AudioModeTest { 7 | @Test 8 | fun `get enum value from int`() { 9 | Assert.assertEquals(AudioMode.from(1), AudioMode.Mono16K) 10 | Assert.assertEquals(AudioMode.from(2), AudioMode.Mono48K) 11 | Assert.assertEquals(AudioMode.from(3), AudioMode.Stereo48K) 12 | } 13 | 14 | @Test 15 | fun `get enum value from invalid int returns null`() { 16 | Assert.assertNull(AudioMode.from(-1)) 17 | Assert.assertNull(AudioMode.from(4)) 18 | } 19 | 20 | @Test 21 | fun `get enum value from int with fallback to default value`() { 22 | Assert.assertEquals(AudioMode.from(-1, AudioMode.Stereo48K), AudioMode.Stereo48K) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/audio/activespeakerpolicy/DefaultActiveSpeakerPolicyTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.activespeakerpolicy 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AttendeeInfo 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.VolumeLevel 10 | import kotlinx.coroutines.ExperimentalCoroutinesApi 11 | import org.junit.Before 12 | import org.junit.Test 13 | 14 | @ExperimentalCoroutinesApi 15 | class DefaultActiveSpeakerPolicyTest { 16 | 17 | private lateinit var activeSpeakerPolicy: DefaultActiveSpeakerPolicy 18 | 19 | private val attendeeInfo = AttendeeInfo( 20 | "attendeeId", 21 | "externalUserId" 22 | ) 23 | 24 | @Before 25 | fun setup() { 26 | activeSpeakerPolicy = DefaultActiveSpeakerPolicy() 27 | } 28 | 29 | @Test 30 | fun `DefaultActiveSpeakerPolicy should not be null`() { 31 | assert(activeSpeakerPolicy != null) 32 | } 33 | 34 | @Test 35 | fun `speaker score should be 0 when volume is muted`() { 36 | val score = activeSpeakerPolicy.calculateScore(attendeeInfo, VolumeLevel.Muted) 37 | 38 | assert(score == 0.0) 39 | } 40 | 41 | @Test 42 | fun `speaker score should not be 0 when volume is greater than NotSpeaking`() { 43 | val score = activeSpeakerPolicy.calculateScore(attendeeInfo, VolumeLevel.Low) 44 | 45 | assert(score > 0.0) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/metric/ObservableMetricTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.metric 7 | 8 | import org.junit.Assert.assertFalse 9 | import org.junit.Assert.assertTrue 10 | import org.junit.Test 11 | 12 | class ObservableMetricTest { 13 | @Test 14 | fun `isContentShareMetric should return expected values`() { 15 | assertTrue(ObservableMetric.contentShareVideoSendBitrate.isContentShareMetric()) 16 | assertFalse(ObservableMetric.videoSendBitrate.isContentShareMetric()) 17 | assertTrue(ObservableMetric.contentShareVideoSendFps.isContentShareMetric()) 18 | assertFalse(ObservableMetric.videoSendFps.isContentShareMetric()) 19 | assertTrue(ObservableMetric.contentShareVideoSendPacketLossPercent.isContentShareMetric()) 20 | assertFalse(ObservableMetric.videoSendPacketLossPercent.isContentShareMetric()) 21 | assertTrue(ObservableMetric.contentShareVideoSendRttMs.isContentShareMetric()) 22 | assertFalse(ObservableMetric.videoSendRttMs.isContentShareMetric()) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/DefaultVideoTileFactoryTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.ConsoleLogger 9 | import org.junit.Assert.assertEquals 10 | import org.junit.Assert.assertNotNull 11 | import org.junit.Test 12 | 13 | class DefaultVideoTileFactoryTest { 14 | @Test 15 | fun `makeTile should return object with data from parameters`() { 16 | val testTileId = 1 17 | val testAttendeeId = "attendeeId" 18 | val testWidth = 720 19 | val testHeight = 1280 20 | val testLogger = ConsoleLogger() 21 | val videoTileFactory = DefaultVideoTileFactory(testLogger) 22 | 23 | val testOutput: VideoTile = videoTileFactory.makeTile(testTileId, testAttendeeId, testWidth, testHeight, false) 24 | 25 | assertNotNull(testOutput) 26 | assertEquals(testTileId, testOutput.state.tileId) 27 | assertEquals(testAttendeeId, testOutput.state.attendeeId) 28 | assertEquals(testWidth, testOutput.state.videoStreamContentWidth) 29 | assertEquals(testHeight, testOutput.state.videoStreamContentHeight) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/audiovideo/video/VideoTileStateTest.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.audiovideo.video 2 | 3 | import org.junit.Assert.assertFalse 4 | import org.junit.Assert.assertTrue 5 | import org.junit.Test 6 | 7 | class VideoTileStateTest { 8 | 9 | private val tileId = 117 // some random id 10 | private val testWidth = 720 11 | private val testHeight = 1280 12 | private val attendeeIdVideo = "chimesarang" 13 | private val attendeeIdScreenShare = "chimesarang#content" 14 | 15 | // local tile 16 | val vtsLocal = VideoTileState(tileId, attendeeIdVideo, testWidth, testHeight, VideoPauseState.Unpaused, true) 17 | 18 | // regular video sharing 19 | val vtsVideo = VideoTileState(tileId, attendeeIdVideo, testWidth, testHeight, VideoPauseState.Unpaused, false) 20 | 21 | // screen sharing 22 | val vtsScreenShare = VideoTileState(tileId, attendeeIdScreenShare, testWidth, testHeight, VideoPauseState.Unpaused, false) 23 | 24 | @Test 25 | fun `isLocalTile should be true when tile is local`() { 26 | assertTrue(vtsLocal.isLocalTile) 27 | assertFalse(vtsVideo.isLocalTile) 28 | assertFalse(vtsScreenShare.isLocalTile) 29 | } 30 | 31 | @Test 32 | fun `isContent should be true when sharing screen`() { 33 | assertFalse(vtsLocal.isContent) 34 | assertFalse(vtsVideo.isContent) 35 | assertTrue(vtsScreenShare.isContent) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/ingestion/DefaultMeetingEventReporterFactoryTest.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdk.meetings.ingestion 2 | 3 | import android.content.Context 4 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.Logger 5 | import io.mockk.MockKAnnotations 6 | import io.mockk.every 7 | import io.mockk.impl.annotations.MockK 8 | import org.junit.Assert.assertNotNull 9 | import org.junit.Before 10 | import org.junit.Test 11 | 12 | class DefaultMeetingEventReporterFactoryTest { 13 | 14 | @MockK 15 | private lateinit var context: Context 16 | 17 | @MockK 18 | private lateinit var ingestionConfiguration: IngestionConfiguration 19 | 20 | @MockK 21 | private lateinit var logger: Logger 22 | 23 | private lateinit var factory: DefaultMeetingEventReporterFactory 24 | 25 | @Before 26 | fun setup() { 27 | MockKAnnotations.init(this, relaxUnitFun = true) 28 | 29 | every { ingestionConfiguration.ingestionUrl } returns "http://test.com/" 30 | every { ingestionConfiguration.flushIntervalMs } returns 1L 31 | 32 | factory = DefaultMeetingEventReporterFactory(context, ingestionConfiguration, logger) 33 | } 34 | 35 | @Test 36 | fun `createEventReporter should return EventReporter`() { 37 | 38 | every { ingestionConfiguration.disabled } returns false 39 | 40 | val reporter = factory.createEventReporter() 41 | 42 | assertNotNull(reporter) 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/ingestion/IngestionEventTests.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.ingestion 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.analytics.EventAttributeName 9 | import com.google.gson.Gson 10 | import org.junit.Assert 11 | import org.junit.Test 12 | 13 | class IngestionEventTests { 14 | private val metadata = mapOf( 15 | EventAttributeName.meetingId.name to "eeeeeeieei" 16 | ) 17 | private val payloads = listOf(mapOf( 18 | "1" to "2", 19 | "hello" to 5 20 | )) 21 | 22 | @Test 23 | fun `IngestionEvent version should be encoded as v`() { 24 | val ingestionEvent = IngestionEvent(EventClientType.Meet.name, metadata, payloads) 25 | val gson = Gson() 26 | 27 | val ingestionEventJson = gson.toJson(ingestionEvent) 28 | 29 | Assert.assertTrue(ingestionEventJson.contains("\"v\":")) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/AttendeeStatusTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal 7 | 8 | import org.junit.Assert 9 | import org.junit.Test 10 | 11 | class AttendeeStatusTest { 12 | @Test 13 | fun `from should return object with value from param`() { 14 | Assert.assertEquals(AttendeeStatus.Joined, AttendeeStatus.from(1)) 15 | Assert.assertEquals(AttendeeStatus.Left, AttendeeStatus.from(2)) 16 | Assert.assertEquals(AttendeeStatus.Dropped, AttendeeStatus.from(3)) 17 | } 18 | 19 | @Test 20 | fun `from should return null with invalid value from param`() { 21 | Assert.assertNull(AttendeeStatus.from(4)) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/internal/utils/TimezoneUtilsTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.internal.utils 7 | 8 | import java.util.TimeZone 9 | import org.junit.Assert 10 | import org.junit.Test 11 | 12 | class TimezoneUtilsTest { 13 | @Test 14 | fun `getUtcOffset should return correctly formatted positive Utc offset`() { 15 | Assert.assertEquals("+05:30", TimezoneUtils.getUtcOffset(TimeZone.getTimeZone("Asia/Calcutta"))) 16 | } 17 | 18 | @Test 19 | fun `getUtcOffset should return correctly formatted negative Utc offset`() { 20 | Assert.assertEquals("-06:00", TimezoneUtils.getUtcOffset(TimeZone.getTimeZone("America/Costa_Rica"))) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/realtime/datamessage/DataMessageTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.realtime.datamessage 7 | 8 | import com.google.gson.Gson 9 | import org.junit.Assert.assertEquals 10 | import org.junit.Test 11 | 12 | class DataMessageTest { 13 | @Test 14 | fun `text should return data as a string`() { 15 | val dataString = "hello" 16 | val dataBytes = dataString.toByteArray() 17 | val dataMessage = DataMessage( 18 | 10000, 19 | "topic", 20 | dataBytes, 21 | "attendeeId", 22 | "externalId", 23 | false) 24 | 25 | assertEquals(dataString, dataMessage.text()) 26 | } 27 | 28 | @Test 29 | fun `fromJson should return data as a given type`() { 30 | val obj = CustomerDataClass("hello", 1) 31 | val dataBytes = Gson().toJson(obj).toByteArray() 32 | val dataMessage = DataMessage( 33 | 10000, 34 | "topic", 35 | dataBytes, 36 | "attendeeId", 37 | "externalId", 38 | false 39 | ) 40 | 41 | val objFromJson = dataMessage.fromJson(CustomerDataClass::class.java) 42 | 43 | assertEquals(obj, objFromJson) 44 | } 45 | 46 | data class CustomerDataClass(val string: String, val number: Int) 47 | } 48 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSessionStatusCodeTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | import org.junit.Assert.assertEquals 9 | import org.junit.Assert.assertNull 10 | import org.junit.Test 11 | 12 | class MeetingSessionStatusCodeTest { 13 | @Test 14 | fun `from should return MeetingSessionStatusCode when defined value`() { 15 | assertEquals( 16 | MeetingSessionStatusCode.OK, 17 | MeetingSessionStatusCode.from(0) 18 | ) 19 | assertEquals( 20 | MeetingSessionStatusCode.AudioJoinedFromAnotherDevice, 21 | MeetingSessionStatusCode.from(2) 22 | ) 23 | assertEquals( 24 | MeetingSessionStatusCode.AudioCallEnded, 25 | MeetingSessionStatusCode.from(6) 26 | ) 27 | assertEquals( 28 | MeetingSessionStatusCode.AudioDisconnected, 29 | MeetingSessionStatusCode.from(9) 30 | ) 31 | } 32 | 33 | @Test 34 | fun `from should return null when undefined value`() { 35 | assertNull(MeetingSessionStatusCode.from(-99)) 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/session/MeetingSessionStatusTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.session 7 | 8 | import org.junit.Assert.assertEquals 9 | import org.junit.Assert.assertNotNull 10 | import org.junit.Assert.assertNull 11 | import org.junit.Test 12 | 13 | class MeetingSessionStatusTest { 14 | private val testStatusCode = MeetingSessionStatusCode.OK 15 | 16 | @Test 17 | fun `constructor should return object with value from param`() { 18 | val testOutput = MeetingSessionStatus(testStatusCode) 19 | 20 | assertNotNull(testOutput) 21 | assertEquals(testStatusCode, testOutput.statusCode) 22 | } 23 | 24 | @Test 25 | fun `secondary constructor should return object with non null status code when using defined values`() { 26 | val testOutput = MeetingSessionStatus(0) 27 | 28 | assertNotNull(testOutput) 29 | assertEquals(testStatusCode, testOutput.statusCode) 30 | } 31 | 32 | @Test 33 | fun `secondary constructor should return status with null status code when using undefined values`() { 34 | val testOutput = MeetingSessionStatus(-99) 35 | 36 | assertNotNull(testOutput) 37 | assertNull("actual: ${testOutput.statusCode}", testOutput.statusCode) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /amazon-chime-sdk/src/test/java/com/amazonaws/services/chime/sdk/meetings/utils/VersioningTest.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdk.meetings.utils 7 | 8 | import java.io.FileInputStream 9 | import java.util.Properties 10 | import org.junit.Assert.assertEquals 11 | import org.junit.Test 12 | 13 | class VersioningTest { 14 | @Test 15 | fun `sdkVersion should return version string matching with properties file`() { 16 | val sdkVersion = Versioning.sdkVersion() 17 | val file = FileInputStream("version.properties") 18 | val versionProp = Properties() 19 | 20 | versionProp.load(file) 21 | val version = "${versionProp.getProperty("versionMajor")}.${versionProp.getProperty("versionMinor")}.${versionProp.getProperty("versionPatch")}" 22 | 23 | assertEquals(sdkVersion, version) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /amazon-chime-sdk/version.properties: -------------------------------------------------------------------------------- 1 | versionMajor=0 2 | versionMinor=24 3 | versionPatch=1 4 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | 23 | -keep class com.amazonaws.services.chime.sdkdemo.data.** { *; } 24 | -------------------------------------------------------------------------------- /app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/activity/SplashActivity.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.activity 7 | 8 | import android.content.Intent 9 | import android.content.pm.ActivityInfo 10 | import android.os.Bundle 11 | import android.os.Handler 12 | import android.view.Window 13 | import android.view.WindowManager 14 | import androidx.appcompat.app.AppCompatActivity 15 | import com.amazonaws.services.chime.sdkdemo.R 16 | 17 | class SplashActivity : AppCompatActivity() { 18 | 19 | private val SPLASH_TIME_OUT_MILLISECOND: Long = 3000 20 | 21 | override fun onCreate(savedInstanceState: Bundle?) { 22 | super.onCreate(savedInstanceState) 23 | this.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LOCKED 24 | window.requestFeature(Window.FEATURE_NO_TITLE) 25 | window.setFlags( 26 | WindowManager.LayoutParams.FLAG_FULLSCREEN, 27 | WindowManager.LayoutParams.FLAG_FULLSCREEN 28 | ) 29 | setContentView(R.layout.activity_splash) 30 | 31 | Handler().postDelayed({ 32 | startActivity(Intent(this@SplashActivity, HomeActivity::class.java)) 33 | finish() 34 | }, SPLASH_TIME_OUT_MILLISECOND) 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/adapter/VideoDiffCallback.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdkdemo.adapter 2 | 3 | import androidx.recyclerview.widget.DiffUtil 4 | import com.amazonaws.services.chime.sdkdemo.data.VideoCollectionTile 5 | 6 | class VideoDiffCallback( 7 | private val oldList: List, 8 | private val newList: List 9 | ) : 10 | DiffUtil.Callback() { 11 | 12 | override fun getOldListSize(): Int { 13 | return oldList.size 14 | } 15 | 16 | override fun getNewListSize(): Int { 17 | return newList.size 18 | } 19 | 20 | override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { 21 | return oldList[oldItemPosition].videoTileState.attendeeId == newList[newItemPosition].videoTileState.attendeeId 22 | } 23 | 24 | override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { 25 | val oldTileState = oldList[oldItemPosition].videoTileState 26 | val newTileState = newList[newItemPosition].videoTileState 27 | 28 | return oldTileState.attendeeId == newTileState.attendeeId && 29 | oldTileState.pauseState == newTileState.pauseState && 30 | oldTileState.videoStreamContentWidth == newTileState.videoStreamContentWidth && 31 | oldTileState.videoStreamContentHeight == newTileState.videoStreamContentHeight 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/Caption.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.data 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.TranscriptItem 9 | 10 | data class Caption( 11 | val speakerName: String?, 12 | val isPartial: Boolean, 13 | val content: String, 14 | val items: Array? = null, 15 | val entities: MutableSet? = null 16 | ) 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/JoinMeetingResponse.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.data 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.session.Attendee 9 | import com.amazonaws.services.chime.sdk.meetings.session.MediaPlacement 10 | import com.google.gson.annotations.SerializedName 11 | 12 | data class JoinMeetingResponse( 13 | @SerializedName("JoinInfo") val joinInfo: MeetingInfo 14 | ) 15 | 16 | data class MeetingInfo( 17 | @SerializedName("Meeting") val meetingResponse: MeetingResponse, 18 | @SerializedName("Attendee") val attendeeResponse: AttendeeResponse, 19 | @SerializedName("PrimaryExternalMeetingId") val primaryExternalMeetingId: String 20 | ) 21 | 22 | data class MeetingResponse( 23 | @SerializedName("Meeting") val meeting: MeetingResp 24 | ) 25 | 26 | data class AttendeeResponse( 27 | @SerializedName("Attendee") val attendee: Attendee 28 | ) 29 | data class MeetingResp( 30 | val ExternalMeetingId: String?, 31 | val MediaPlacement: MediaPlacement, 32 | val MediaRegion: String, 33 | val MeetingId: String, 34 | val MeetingFeatures: MeetingFeaturesResp? 35 | ) 36 | data class MeetingFeaturesResp constructor( 37 | val Audio: AudioFeatures?, 38 | val Video: VideoFeatures?, 39 | val Content: VideoFeatures?, 40 | val Attendee: AttendeeFeatures? 41 | ) 42 | data class AudioFeatures @JvmOverloads constructor( 43 | val EchoReduction: String? 44 | ) 45 | data class VideoFeatures @JvmOverloads constructor( 46 | val MaxResolution: String? 47 | ) 48 | data class AttendeeFeatures @JvmOverloads constructor( 49 | val MaxCount: Int? 50 | ) 51 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/Message.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.data 7 | 8 | import java.text.SimpleDateFormat 9 | import java.util.Date 10 | 11 | data class Message( 12 | val senderName: String, 13 | val timestamp: Long, 14 | val text: String, 15 | val isLocal: Boolean 16 | ) { 17 | val displayTime: String 18 | get() { 19 | return SimpleDateFormat("HH:mm").format(Date(timestamp)) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/MetricData.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.data 7 | 8 | data class MetricData( 9 | val metricName: String, 10 | val metricValue: String 11 | ) 12 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/RosterAttendee.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.data 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.SignalStrength 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.VolumeLevel 10 | import com.amazonaws.services.chime.sdk.meetings.internal.AttendeeStatus 11 | 12 | data class RosterAttendee( 13 | val attendeeId: String, 14 | val attendeeName: String, 15 | val volumeLevel: VolumeLevel = VolumeLevel.NotSpeaking, 16 | val signalStrength: SignalStrength = SignalStrength.High, 17 | val isActiveSpeaker: Boolean = false, 18 | val attendeeStatus: AttendeeStatus = AttendeeStatus.Joined 19 | ) 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/TranscriptionConfig.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdkdemo.data 2 | 3 | data class SpinnerItem(val spinnerText: String?, val value: String) { 4 | override fun toString(): String { 5 | return value 6 | } 7 | } 8 | 9 | data class TranscribeLanguageOption( 10 | val languageGroupIndex: Int, 11 | val languageCodeIndex: Int, 12 | val transcribeLanguage: SpinnerItem 13 | ) { 14 | override fun equals(other: Any?): Boolean { 15 | if (this === other) return true 16 | if (javaClass != other?.javaClass) return false 17 | 18 | other as TranscribeLanguageOption 19 | 20 | if (languageGroupIndex != other.languageGroupIndex && languageCodeIndex != other.languageCodeIndex) 21 | return false 22 | 23 | return true 24 | } 25 | 26 | override fun hashCode(): Int { 27 | var result = languageGroupIndex 28 | result = 31 * result + languageCodeIndex 29 | return result 30 | } 31 | } 32 | 33 | data class TranscriptionStreamParams( 34 | val contentIdentificationType: String?, 35 | val contentRedactionType: String?, 36 | val enablePartialResultsStabilization: Boolean, 37 | val partialResultsStability: String?, 38 | val piiEntityTypes: String?, 39 | val languageModelName: String?, 40 | val identifyLanguage: Boolean?, 41 | val languageOptions: String?, 42 | val preferredLanguage: String? 43 | ) 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/data/VideoCollectionTile.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | package com.amazonaws.services.chime.sdkdemo.data 6 | 7 | import androidx.constraintlayout.widget.ConstraintLayout 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.DefaultVideoRenderView 9 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.VideoTileState 10 | 11 | data class VideoCollectionTile( 12 | val attendeeName: String, 13 | val videoTileState: VideoTileState 14 | ) { 15 | var videoRenderView: DefaultVideoRenderView? = null 16 | var pauseMessageView: ConstraintLayout? = null 17 | 18 | fun setRenderViewVisibility(visibility: Int) { 19 | videoRenderView?.visibility = visibility 20 | } 21 | 22 | fun setPauseMessageVisibility(visibility: Int) { 23 | pauseMessageView?.visibility = visibility 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/device/AudioDeviceManager.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.device 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoFacade 9 | import com.amazonaws.services.chime.sdk.meetings.device.MediaDevice 10 | 11 | /** 12 | * In order to support 23 or below we'll need to manually handle active audio device locally. 13 | */ 14 | class AudioDeviceManager(private val audioVideo: AudioVideoFacade) { 15 | // Handle active audio device for 21-23 since getActiveAudioDevice is only supported 24+ 16 | private var currentActiveAudioDevice: MediaDevice? = null 17 | 18 | val activeAudioDevice: MediaDevice? get() = currentActiveAudioDevice 19 | 20 | /** 21 | * Set active device whenever chooseAudioDevice is called. 22 | */ 23 | fun setActiveAudioDevice(mediaDevice: MediaDevice) { 24 | currentActiveAudioDevice = mediaDevice 25 | } 26 | 27 | /** 28 | * Reconfigure active device based on priority. 29 | * Current priority is bluetooth -> wired headset -> speakerphone -> earpiece 30 | */ 31 | fun reconfigureActiveAudioDevice() { 32 | val devices = audioVideo.listAudioDevices().sortedBy { it.order } 33 | if (devices.isNotEmpty()) { 34 | if (devices[0] == currentActiveAudioDevice) return 35 | audioVideo.chooseAudioDevice(devices[0]) 36 | setActiveAudioDevice(devices[0]) 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/model/DebugSettingsViewModel.kt: -------------------------------------------------------------------------------- 1 | package com.amazonaws.services.chime.sdkdemo.model 2 | 3 | import androidx.lifecycle.MutableLiveData 4 | import androidx.lifecycle.ViewModel 5 | 6 | class DebugSettingsViewModel : ViewModel() { 7 | val endpointUrl = MutableLiveData("") 8 | val primaryMeetingId = MutableLiveData("") 9 | 10 | fun sendEndpointUrl(data: String) { 11 | endpointUrl.value = data 12 | } 13 | 14 | fun sendPrimaryMeetingId(data: String) { 15 | primaryMeetingId.value = data 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/src/main/java/com/amazonaws/services/chime/sdkdemo/utils/LogEntry.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | package com.amazonaws.services.chime.sdkdemo.utils 7 | 8 | import com.amazonaws.services.chime.sdk.meetings.utils.logger.LogLevel 9 | 10 | /** 11 | * Log format for the server 12 | * 13 | * @property sequenceNumber sequence number of the log 14 | * @property message message to log 15 | * @property timestampMs time of when log occurred 16 | * @property logLevel level of log 17 | */ 18 | data class LogEntry( 19 | val sequenceNumber: Int, 20 | val message: String, 21 | val timestampMs: Long, 22 | val logLevel: LogLevel 23 | ) 24 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/active_speaker_circle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_camera_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_end.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_more.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_mute.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_mute_on.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_send_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_speaker.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_switch_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/button_up.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_camera_disabled.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_camera_enabled.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_connection_problem.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_hang_up.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_audio_2.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_audio_3.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_disabled.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_enabled.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_microphone_poor_connectivity.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_more_horiz.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mute.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_mute_on.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_pause_video.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_resume_video.xml: -------------------------------------------------------------------------------- 1 | 6 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_up.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 15 | 16 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/messages_border.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_meeting.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_splash.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_transcription_config.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/row_caption.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 20 | 21 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /app/src/main/res/layout/row_language_option.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/layout/row_message.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | 20 | 21 | 29 | 30 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /app/src/main/res/layout/row_metric.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 24 | 25 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/menu/priority_popup_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 13 | 14 | -------------------------------------------------------------------------------- /app/src/main/res/menu/resolution_popup_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | -------------------------------------------------------------------------------- /app/src/main/res/menu/video_filter_popup_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-hdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-mdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | #008577 10 | #00574B 11 | #D81B60 12 | #3f4149 13 | #FFFFFF 14 | #000000 15 | 16 | 17 | #E9E9E9 18 | #64000000 19 | 20 | 21 | #929292 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 15 | 16 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | # Create pull request comments to give a quick overview of how a PR will affect the code coverage 2 | comment: 3 | layout: "reach, diff, flags, files" 4 | behavior: default 5 | 6 | # Set status checks to block PR if the code coverage drops by 0%. Usage: https://docs.codecov.com/docs/commit-status 7 | coverage: 8 | status: 9 | project: 10 | default: 11 | target: auto 12 | threshold: 0% 13 | base: auto 14 | -------------------------------------------------------------------------------- /docs/amazon-chime-sdk/scripts/sourceset_dependencies.js: -------------------------------------------------------------------------------- 1 | {"@class":"org.jetbrains.dokka.base.templating.AddToSourcesetDependencies","moduleName":"amazon-chime-sdk","content":{":amazon-chime-sdk:dokkaHtmlPartial/debug":[],":amazon-chime-sdk:dokkaHtmlPartial/main":[],":amazon-chime-sdk:dokkaHtmlPartial/release":[]}} 2 | -------------------------------------------------------------------------------- /docs/images/anchor-copy-button.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/images/arrow_down.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/burger.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docs/images/copy-icon.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/copy-successful-icon.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/footer-go-to-link.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/go-to-top-icon.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /docs/images/homepage.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /docs/images/logo-icon.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /docs/images/nav-icons/abstract-class.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /docs/images/nav-icons/class-kotlin.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/images/nav-icons/class.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/nav-icons/enum-kotlin.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/images/nav-icons/enum.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/nav-icons/exception-class.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/nav-icons/field-value.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/images/nav-icons/field-variable.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /docs/images/nav-icons/function.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/nav-icons/interface-kotlin.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/images/nav-icons/interface.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/images/nav-icons/object.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/images/nav-icons/typealias-kotlin.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /docs/images/theme-toggle.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/scripts/sourceset_dependencies.js: -------------------------------------------------------------------------------- 1 | sourceset_dependencies = '{":amazon-chime-sdk:dokkaHtmlPartial/debug":[],":amazon-chime-sdk:dokkaHtmlPartial/main":[],":amazon-chime-sdk:dokkaHtmlPartial/release":[]}' -------------------------------------------------------------------------------- /docs/styles/logo-styles.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2014-2023 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 | */ 4 | 5 | :root { 6 | --dokka-logo-image-url: url('../images/logo-icon.svg'); 7 | --dokka-logo-height: 50px; 8 | --dokka-logo-width: 50px; 9 | } 10 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aws/amazon-chime-sdk-android/a38d9a444a26c5dd7bcc6a9337bd6eee9f61c6c7/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /guides/event_ingestion.md: -------------------------------------------------------------------------------- 1 | # Event Ingestion 2 | 3 | We send the [Amazon Chime SDK meeting events](meeting_events.md) to the Amazon Chime backend to analyze meeting health trends or identify common failures. This helps us to improve your meeting experience. 4 | 5 | ## Sensitive attributes 6 | The Amazon Chime SDK for Android will not send below sensitive attributes to the Amazon Chime backend. 7 | |Attribute|Description 8 | |--|-- 9 | |`externalMeetingId`|The Amazon Chime SDK external meeting ID. 10 | |`externalUserId`|The Amazon Chime SDK external user ID that can indicate an identity managed by your application. 11 | 12 | ## Opt out of Event Ingestion 13 | 14 | To opt out of event ingestion, provide `NoopEventReporterFactory` to `DefaultMeetingSession` while creating the 15 | meeting session. 16 | 17 | See following example code: 18 | ```kotlin 19 | DefaultMeetingSession( 20 | meetingSessionConfiguration, 21 | logger, 22 | applicationContext, 23 | DefaultEglCoreFactory(), 24 | NoopEventReporterFactory() 25 | ) 26 | ``` -------------------------------------------------------------------------------- /pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo "Running git pre-commit hook" 4 | 5 | ./gradlew ktlintCheck 6 | 7 | RESULT=$? 8 | 9 | [ $RESULT -ne 0 ] && exit 1 10 | 11 | exit 0 12 | -------------------------------------------------------------------------------- /pull_request_template.md: -------------------------------------------------------------------------------- 1 | ## ℹ️ Description 2 | *provide a summary of the changes and the related issue, relevant motivation and context* 3 | 4 | ### Issue #, if available 5 | 6 | ### Type of change 7 | - [ ] Bug fix (non-breaking change which fixes an issue) 8 | - [ ] New feature (non-breaking change which adds functionality) 9 | - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) 10 | - [ ] This change requires a documentation update 11 | - [ ] README update 12 | - [ ] CHANGELOG update 13 | - [ ] guides update 14 | - [ ] This change requires a dependency update 15 | - [ ] Amazon Chime SDK Media 16 | - [ ] Other (update corresponding legal documents) 17 | 18 | ## 🧪 How Has This Been Tested? 19 | *describe the tests that you ran to verify your changes, any relevant details for your test configuration* 20 | 21 | ### Unit test coverage 22 | * Class coverage: 23 | * Line coverage: 24 | 25 | ### Additional Manual Test 26 | - [ ] Pause and resume remote video 27 | - [ ] Switch local camera 28 | - [ ] Rotate screen back and forth 29 | 30 | ## 📱 Screenshots, if available 31 | *provide screenshots/video record if there's a UI change in demo app* 32 | 33 | By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice. 34 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * SPDX-License-Identifier: Apache-2.0 4 | */ 5 | 6 | include ':app', ':amazon-chime-sdk' 7 | rootProject.name='amazon-chime-sdk-android' 8 | --------------------------------------------------------------------------------