/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ package com.amazonaws.services.chime.sdkdemo.fragment import android.content.Context import android.hardware.camera2.CameraManager import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Button import android.widget.Spinner import android.widget.TextView import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoConfiguration import com.amazonaws.services.chime.sdk.meetings.audiovideo.AudioVideoFacade import com.amazonaws.services.chime.sdk.meetings.audiovideo.audio.AudioMode import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.DefaultVideoRenderView import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture.CameraCaptureSource import com.amazonaws.services.chime.sdk.meetings.audiovideo.video.capture.VideoCaptureFormat import com.amazonaws.services.chime.sdk.meetings.device.DeviceChangeObserver import com.amazonaws.services.chime.sdk.meetings.device.MediaDevice import com.amazonaws.services.chime.sdk.meetings.device.MediaDeviceType import com.amazonaws.services.chime.sdk.meetings.utils.logger.ConsoleLogger import com.amazonaws.services.chime.sdk.meetings.utils.logger.LogLevel import com.amazonaws.services.chime.sdkdemo.R import com.amazonaws.services.chime.sdkdemo.activity.HomeActivity import com.amazonaws.services.chime.sdkdemo.activity.MeetingActivity import com.amazonaws.services.chime.sdkdemo.utils.isLandscapeMode import java.lang.ClassCastException import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch class DeviceManagementFragment : Fragment(), DeviceChangeObserver { private val logger = ConsoleLogger(LogLevel.INFO) private val uiScope = CoroutineScope(Dispatchers.Main) private val audioDevices = mutableListOf() private val videoDevices = mutableListOf() private val videoFormats = mutableListOf() private lateinit var cameraManager: CameraManager private lateinit var listener: DeviceManagementEventListener private lateinit var audioVideo: AudioVideoFacade private lateinit var cameraCaptureSource: CameraCaptureSource private lateinit var videoPreview: DefaultVideoRenderView private val TAG = "DeviceManagementFragment" private lateinit var audioDeviceSpinner: Spinner private lateinit var audioDeviceArrayAdapter: ArrayAdapter private lateinit var videoDeviceSpinner: Spinner private lateinit var videoDeviceArrayAdapter: ArrayAdapter private lateinit var videoFormatSpinner: Spinner private lateinit var videoFormatArrayAdapter: ArrayAdapter private val VIDEO_ASPECT_RATIO_16_9 = 0.5625 private val AUDIO_DEVICE_SPINNER_INDEX_KEY = "audioDeviceSpinnerIndex" private val VIDEO_DEVICE_SPINNER_INDEX_KEY = "videoDeviceSpinnerIndex" private val VIDEO_FORMAT_SPINNER_INDEX_KEY = "videoFormatSpinnerIndex" private val MAX_VIDEO_FORMAT_HEIGHT = 800 private val MAX_VIDEO_FORMAT_FPS = 30 companion object { fun newInstance(meetingId: String, name: String, audioVideoConfig: AudioVideoConfiguration): DeviceManagementFragment { val fragment = DeviceManagementFragment() fragment.arguments = bundleOf( HomeActivity.MEETING_ID_KEY to meetingId, HomeActivity.NAME_KEY to name, HomeActivity.AUDIO_MODE_KEY to audioVideoConfig.audioMode.value ) return fragment } } interface DeviceManagementEventListener { fun onJoinMeetingClicked() fun onCachedDeviceSelected(mediaDevice: MediaDevice) } override fun onAttach(context: Context) { super.onAttach(context) if (context is DeviceManagementEventListener) { listener = context } else { logger.error(TAG, "$context must implement DeviceManagementEventListener.") throw ClassCastException("$context must implement DeviceManagementEventListener.") } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_device_management, container, false) val context = activity as Context val meetingId = arguments?.getString(HomeActivity.MEETING_ID_KEY) val name = arguments?.getString(HomeActivity.NAME_KEY) val audioMode = arguments?.getInt(HomeActivity.AUDIO_MODE_KEY)?.let { intValue -> AudioMode.from(intValue, defaultAudioMode = AudioMode.Stereo48K) } ?: AudioMode.Stereo48K audioVideo = (activity as MeetingActivity).getAudioVideo() val displayedText = getString(R.string.preview_meeting_info, meetingId, name) view.findViewById(R.id.textViewMeetingPreview)?.text = displayedText view.findViewById