private static DropdownController <IosImagePickerCameraDevice> SetupCameraDeviceDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown)
    {
        var allCameraDevices = new[]
        {
            IosImagePickerCameraDevice.Front,
            IosImagePickerCameraDevice.Rear,
        };

        var valueVisibilityFilter = default(Func <IosImagePickerCameraDevice, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = NativeIosImagePicker.IsCameraDeviceAvailable;
        }

        var dropdownController = new DropdownController <IosImagePickerCameraDevice>(
            allCameraDevices,
            rowGameObject,
            dropdown,
            () => iosImagePicker.CameraDevice,
            cameraDevice => iosImagePicker.CameraDevice = cameraDevice,
            valueVisibilityFilter);

        dropdownController.Setup();
        return(dropdownController);
    }
    private static DropdownController <IosImagePickerSourceType> SetupSourceTypeDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown)
    {
        var allSourceTypes = new[]
        {
            IosImagePickerSourceType.PhotoLibrary,
            IosImagePickerSourceType.Camera,
            IosImagePickerSourceType.SavedPhotosAlbum,
        };

        var valueVisibilityFilter = default(Func <IosImagePickerSourceType, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = NativeIosImagePicker.IsSourceTypeAvailable;
        }

        var dropdownController = new DropdownController <IosImagePickerSourceType>(
            allSourceTypes,
            rowGameObject,
            dropdown,
            () => iosImagePicker.SourceType,
            sourceType => iosImagePicker.SourceType = sourceType,
            valueVisibilityFilter);

        dropdownController.Setup();
        return(dropdownController);
    }
    private static ToggleGroupController <string> SetupMediaTypesToggleGroup(
        IIosImagePicker iosImagePicker,
        Text imageTypeText,
        Text movieTypeText,
        Toggle imageTypeToggle,
        Toggle movieTypeToggle,
        DropdownController <IosImagePickerSourceType> sourceTypeDropdownController)
    {
        var values = new[]
        {
            iosImagePicker.MediaTypeImage,
            iosImagePicker.MediaTypeMovie,
        };

        var labels = new[]
        {
            imageTypeText,
            movieTypeText,
        };

        var toggles = new[]
        {
            imageTypeToggle,
            movieTypeToggle,
        };

        var valueVisibilityFilter = default(Func <string, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = mediaType =>
            {
                var availableMediaTypes = NativeIosImagePicker.AvailableMediaTypesForSourceType(iosImagePicker.SourceType);
                return(availableMediaTypes != null && Array.IndexOf(availableMediaTypes, mediaType) > -1);
            };
        }

        var toggleGroupController = new ToggleGroupController <string>(
            values,
            labels,
            toggles,
            () => iosImagePicker.MediaTypes,
            mediaTypes => iosImagePicker.MediaTypes = mediaTypes,
            valueVisibilityFilter);

        toggleGroupController.Setup();
        sourceTypeDropdownController.AddDependantController(toggleGroupController);
        return(toggleGroupController);
    }
    private void Start()
    {
        var iosImagePicker = default(IIosImagePicker);

#if UNITY_EDITOR
        iosImagePicker = new IosImagePicker.Editor.EditorIosImagePicker();
#else
        if (NativeIosImagePicker.IsCurrentPlatformSupported)
        {
            iosImagePicker = new NativeIosImagePicker();
        }
#endif
        var interfaceControllers = new List <IInterfaceController>();

        var sourceTypeDropdownController = SetupSourceTypeDropdown(iosImagePicker, this.sourceTypeRowGameObject, this.sourceTypeDropdown);
        interfaceControllers.Add(sourceTypeDropdownController);

        var mediaTypesToggleGroupController = SetupMediaTypesToggleGroup(iosImagePicker, this.imageTypeText, this.movieTypeText, this.imageTypeToggle, this.movieTypeToggle, sourceTypeDropdownController);
        interfaceControllers.Add(mediaTypesToggleGroupController);

        var cameraDeviceDropdownController = SetupCameraDeviceDropdown(iosImagePicker, this.cameraDeviceRowGameObject, this.cameraDeviceDropdown);
        interfaceControllers.Add(cameraDeviceDropdownController);

        var cameraCaptureModeDropdownController = SetupCameraCaptureModeDropdown(iosImagePicker, this.cameraCaptureModeRowGameObject, this.cameraCaptureModeDropdown, cameraDeviceDropdownController);
        interfaceControllers.Add(cameraCaptureModeDropdownController);

        var cameraFlashModeDropdownController = SetupCameraFlashModeDropdown(iosImagePicker, this.cameraFlashModeRowGameObject, this.cameraFlashModeDropdown, cameraDeviceDropdownController);
        interfaceControllers.Add(cameraFlashModeDropdownController);

        var allowsEditingDropdownController = SetupAllowsEditingDropdown(iosImagePicker, this.allowsEditingRowGameObject, this.allowsEditingDropdown);
        interfaceControllers.Add(allowsEditingDropdownController);

        var videoQualityDropdownController = SetupVideoQualityDropdown(iosImagePicker, this.videoQualityRowGameObject, this.videoQualityDropdown, mediaTypesToggleGroupController);
        interfaceControllers.Add(videoQualityDropdownController);

        var videoMaxDurationDropdownController = SetupVideoMaxDurationDropdown(iosImagePicker, this.videoMaxDurationRowGameObject, this.videoMaxDurationDropdown, mediaTypesToggleGroupController);
        interfaceControllers.Add(videoMaxDurationDropdownController);

        for (var i = 0; i < interfaceControllers.Count; i++)
        {
            interfaceControllers[i].Refresh();
        }

        this._iosImagePicker       = iosImagePicker;
        this._interfaceControllers = interfaceControllers;
    }
    private static DropdownController <IosImagePickerVideoQualityType> SetupVideoQualityDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown,
        ToggleGroupController <string> mediaTypesToggleGroupController)
    {
        var allQualityTypes = new[]
        {
            IosImagePickerVideoQualityType.High,
            IosImagePickerVideoQualityType.Medium,
            IosImagePickerVideoQualityType.Low,
            IosImagePickerVideoQualityType.VGA640x480,
            IosImagePickerVideoQualityType.IFrame1280x720,
            IosImagePickerVideoQualityType.IFrame960x540,
        };

        var valueVisibilityFilter = default(Func <IosImagePickerVideoQualityType, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = qualityType =>
            {
                var currentMediaTypes = iosImagePicker.MediaTypes;
                return(currentMediaTypes != null && Array.IndexOf(currentMediaTypes, iosImagePicker.MediaTypeMovie) > -1);
            };
        }

        var dropdownController = new DropdownController <IosImagePickerVideoQualityType>(
            allQualityTypes,
            rowGameObject,
            dropdown,
            () => iosImagePicker.VideoQuality,
            videoQuality => iosImagePicker.VideoQuality = videoQuality,
            valueVisibilityFilter);

        dropdownController.Setup();
        mediaTypesToggleGroupController.AddDependantController(dropdownController);
        return(dropdownController);
    }
    private static DropdownController <bool> SetupAllowsEditingDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown)
    {
        var allValues = new[]
        {
            false,
            true,
        };

        var dropdownController = new DropdownController <bool>(
            allValues,
            rowGameObject,
            dropdown,
            () => iosImagePicker.AllowsEditing,
            allowsEditing => iosImagePicker.AllowsEditing = allowsEditing,
            null);

        dropdownController.Setup();
        return(dropdownController);
    }
    private static DropdownController <TimeSpan> SetupVideoMaxDurationDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown,
        ToggleGroupController <string> mediaTypesToggleGroupController)
    {
        var allMaxDurations = new[]
        {
            TimeSpan.FromSeconds(30.0),
            TimeSpan.FromSeconds(200.0),
            TimeSpan.FromSeconds(600.0),
        };

        iosImagePicker.VideoMaximumDuration = allMaxDurations[0];

        var valueVisibilityFilter = default(Func <TimeSpan, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = maxDuration =>
            {
                var currentMediaTypes = iosImagePicker.MediaTypes;
                return(currentMediaTypes != null && Array.IndexOf(currentMediaTypes, iosImagePicker.MediaTypeMovie) > -1);
            };
        }

        var dropdownController = new DropdownController <TimeSpan>(
            allMaxDurations,
            rowGameObject,
            dropdown,
            () => iosImagePicker.VideoMaximumDuration,
            maxDuration => iosImagePicker.VideoMaximumDuration = maxDuration,
            valueVisibilityFilter);

        dropdownController.Setup();
        mediaTypesToggleGroupController.AddDependantController(dropdownController);
        return(dropdownController);
    }
    private static DropdownController <IosImagePickerCameraFlashMode> SetupCameraFlashModeDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown,
        DropdownController <IosImagePickerCameraDevice> cameraDeviceDropdownController)
    {
        var allFlashModes = new[]
        {
            IosImagePickerCameraFlashMode.Auto,
            IosImagePickerCameraFlashMode.On,
            IosImagePickerCameraFlashMode.Off,
        };

        var valueVisibilityFilter = default(Func <IosImagePickerCameraFlashMode, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = flashMode =>
            {
                var currentCameraDevice = iosImagePicker.CameraDevice;
                return(flashMode != IosImagePickerCameraFlashMode.On || NativeIosImagePicker.IsFlashAvailableForCameraDevice(currentCameraDevice));
            };
        }

        var dropdownController = new DropdownController <IosImagePickerCameraFlashMode>(
            allFlashModes,
            rowGameObject,
            dropdown,
            () => iosImagePicker.CameraFlashMode,
            flashMode => iosImagePicker.CameraFlashMode = flashMode,
            valueVisibilityFilter);

        dropdownController.Setup();
        cameraDeviceDropdownController.AddDependantController(dropdownController);
        return(dropdownController);
    }
    private static DropdownController <IosImagePickerCameraCaptureMode> SetupCameraCaptureModeDropdown(
        IIosImagePicker iosImagePicker,
        GameObject rowGameObject,
        Dropdown dropdown,
        DropdownController <IosImagePickerCameraDevice> cameraDeviceDropdownController)
    {
        var allCaptureModes = new[]
        {
            IosImagePickerCameraCaptureMode.Photo,
            IosImagePickerCameraCaptureMode.Video,
        };

        var valueVisibilityFilter = default(Func <IosImagePickerCameraCaptureMode, bool>);

        if (iosImagePicker is NativeIosImagePicker)
        {
            valueVisibilityFilter = captureMode =>
            {
                var currentCameraDevice   = iosImagePicker.CameraDevice;
                var availableCaptureModes = NativeIosImagePicker.AvailableCaptureModesForCameraDevice(currentCameraDevice);
                return(availableCaptureModes != null && Array.IndexOf(availableCaptureModes, captureMode) > -1);
            };
        }

        var dropdownController = new DropdownController <IosImagePickerCameraCaptureMode>(
            allCaptureModes,
            rowGameObject,
            dropdown,
            () => iosImagePicker.CameraCaptureMode,
            captureMode => iosImagePicker.CameraCaptureMode = captureMode,
            valueVisibilityFilter);

        dropdownController.Setup();
        cameraDeviceDropdownController.AddDependantController(dropdownController);
        return(dropdownController);
    }