--- /dev/null
+/*
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+using System;
+using System.ComponentModel;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using static Interop.CameraDeviceManager;
+
+namespace Tizen.Multimedia
+{
+ /// <summary>
+ /// Provides data for the <see cref="CameraDeviceManager.DeviceConnectionChanged"/> event.
+ /// </summary>
+ /// <since_tizen> 9 </since_tizen>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public class CameraDeviceConnectionChangedEventArgs : EventArgs
+ {
+ internal CameraDeviceConnectionChangedEventArgs(ref CameraDeviceStruct device, bool status)
+ {
+ CameraDeviceInformation = CameraDeviceManager.GetDeviceInformation(device);
+ IsConnected = status;
+ }
+
+ /// <summary>
+ /// Gets the camera device information.
+ /// </summary>
+ /// <since_tizen> 9 </since_tizen>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public CameraDeviceInformation CameraDeviceInformation { get; }
+
+ /// <summary>
+ /// Gets the status of camera device.
+ /// </summary>
+ /// <since_tizen> 9 </since_tizen>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool IsConnected { get; }
+ }
+}
+using System.Linq;
/*
* Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
*
/// <summary>
/// This CameraDeviceManager class provides methods to control current camera devices and get its information.
/// </summary>
+ /// <remarks>
+ /// This supports the product infrastructure and is not intended to be used directly from 3rd party application code.
+ /// </remarks>
/// <since_tizen> 9 </since_tizen>
/// <feature> http://tizen.org/feature/camera </feature>
[EditorBrowsable(EditorBrowsableState.Never)]
- internal class CameraDeviceManager : IDisposable
+ public class CameraDeviceManager : IDisposable
{
private IntPtr _handle;
private bool _disposed;
/// Initializes a new instance of the <see cref="CameraDeviceManager"/> class.
/// </summary>
/// <exception cref="InvalidOperationException">Invalid operation.</exception>
- /// <exception cref="NotSupportedException">The camera feature is not supported.</exception>
+ /// <exception cref="NotSupportedException">The camera device manager is not supported.</exception>
/// <since_tizen> 9 </since_tizen>
[EditorBrowsable(EditorBrowsableState.Never)]
- internal CameraDeviceManager()
+ public CameraDeviceManager()
{
Native.Initialize(out _handle).ThrowIfFailed("Failed to initialize CameraDeviceManager");
- RegisterDeviceListCallback();
+ RegisterCallbacks();
}
/// <summary>
}
/// <summary>
+ /// Gets the status whether camera device(usb, network) is connected or not.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public bool IsExternalCameraConnected =>
+ GetDeviceInformation().Where(d => d.Type == CameraDeviceType.Usb ||
+ d.Type == CameraDeviceType.Network)
+ .Any();
+
+ /// <summary>
/// Gets the current camera device information.
/// </summary>
/// <returns></returns>
/// <since_tizen> 9 </since_tizen>
[EditorBrowsable(EditorBrowsableState.Never)]
- internal ReadOnlyCollection<CameraDeviceInfo> GetDeviceInfo()
+ public ReadOnlyCollection<CameraDeviceInformation> GetDeviceInformation()
{
var deviceList = new Native.CameraDeviceListStruct();
Native.GetDeviceList(Handle, ref deviceList).
ThrowIfFailed("Failed to get camera device list");
- return GetDeviceInfo(deviceList);
+ return GetDeviceInformation(deviceList);
}
- internal static ReadOnlyCollection<CameraDeviceInfo> GetDeviceInfo(Native.CameraDeviceListStruct deviceList)
+ internal static ReadOnlyCollection<CameraDeviceInformation> GetDeviceInformation(Native.CameraDeviceListStruct list)
{
- var cameraDevice = deviceList.device;
+ var devices = list.device;
+ var deviceList = new List<CameraDeviceInformation>();
- var cameraDeviceList = new List<CameraDeviceInfo>();
-
- for (int i = 0 ; i < deviceList.count ; i++)
+ for (int i = 0 ; i < list.count ; i++)
{
- var deviceInfo = new CameraDeviceInfo(cameraDevice[i].Type, cameraDevice[i].device,
- GetString(cameraDevice[i].name), GetString(cameraDevice[i].id));
-
- cameraDeviceList.Add(deviceInfo);
+ var deviceInfo = GetDeviceInformation(devices[i]);
+ deviceList.Add(deviceInfo);
Log.Info(CameraLog.Tag, deviceInfo.ToString());
}
- return new ReadOnlyCollection<CameraDeviceInfo>(cameraDeviceList);
+ return new ReadOnlyCollection<CameraDeviceInformation>(deviceList);
}
+ internal static CameraDeviceInformation GetDeviceInformation(Native.CameraDeviceStruct device) =>
+ new CameraDeviceInformation(device.Type, device.device, GetString(device.name), GetString(device.id));
+
private static string GetString(char[] word)
{
int length = 0;
/// </summary>
/// <since_tizen> 9 </since_tizen>
[EditorBrowsable(EditorBrowsableState.Never)]
- internal event EventHandler<CameraDeviceListChangedEventArgs> CameraDeviceListChanged;
+ public event EventHandler<CameraDeviceListChangedEventArgs> DeviceListChanged;
+
+ /// <summary>
+ /// An event that occurs when camera device is connected or disconnected.
+ /// </summary>
+ /// <since_tizen> 9 </since_tizen>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ public event EventHandler<CameraDeviceConnectionChangedEventArgs> DeviceConnectionChanged;
private IntPtr Handle
{
}
}
- private int callbackId = 0;
- private void RegisterDeviceListCallback()
+ private void RegisterCallbacks()
+ {
+ RegisterDeviceListChangedCallback();
+ RegisterDeviceConnectionChangedCallback();
+ }
+
+ private int listCallbackId = 0;
+ private void RegisterDeviceListChangedCallback()
{
Native.DeviceListChangedCallback callback = (ref Native.CameraDeviceListStruct deviceList, IntPtr userData) =>
{
- CameraDeviceListChanged?.Invoke(this, new CameraDeviceListChangedEventArgs(ref deviceList));
+ DeviceListChanged?.Invoke(this, new CameraDeviceListChangedEventArgs(ref deviceList));
};
- Native.SetDeviceListChangedCallback(Handle, callback, IntPtr.Zero, out callbackId).
+ Native.SetDeviceListChangedCallback(Handle, callback, IntPtr.Zero, out listCallbackId).
ThrowIfFailed("Failed to set device list changed callback");
- Log.Info(CameraLog.Tag, $"callback Id : {callbackId}");
+ Log.Info(CameraLog.Tag, $"callback Id : {listCallbackId}");
}
- private void UnregisterDeviceListCallback()
+ private void UnregisterDeviceListChangedCallback()
{
- Log.Info(CameraLog.Tag, $"callback Id : {callbackId}");
+ Log.Info(CameraLog.Tag, $"callback Id : {listCallbackId}");
- Native.UnsetDeviceListChangedCallback(Handle, callbackId).
+ Native.UnsetDeviceListChangedCallback(Handle, listCallbackId).
ThrowIfFailed("Failed to unset device list changed callback");
}
+ private int connectionCallbackId = 0;
+ private void RegisterDeviceConnectionChangedCallback()
+ {
+ Native.DeviceConnectionChangedCallback callback = (ref Native.CameraDeviceStruct device, bool status, IntPtr userData) =>
+ {
+ DeviceConnectionChanged?.Invoke(this, new CameraDeviceConnectionChangedEventArgs(ref device, status));
+ };
+
+ Native.SetDeviceConnectionChangedCallback(Handle, callback, IntPtr.Zero, out connectionCallbackId).
+ ThrowIfFailed("Failed to set device connection changed callback");
+ }
+
+ private void UnregisterDeviceConnectionChangedCallback()
+ {
+ Native.UnsetDeviceConnectionChangedCallback(Handle, connectionCallbackId).
+ ThrowIfFailed("Failed to unset device connection changed callback");
+ }
+
#region Dispose support
/// <summary>
/// Releases the unmanaged resources used by the camera.
if (_handle != IntPtr.Zero)
{
- UnregisterDeviceListCallback();
+ UnregisterDeviceListChangedCallback();
+ UnregisterDeviceConnectionChangedCallback();
+
Native.Deinitialize(_handle);
_handle = IntPtr.Zero;
}
/// </summary>
/// <since_tizen> 9 </since_tizen>
[EditorBrowsable(EditorBrowsableState.Never)]
- public class CameraDeviceInfo
+ public class CameraDeviceInformation
{
/// <summary>
- /// Initializes a new instance of the <see cref="CameraDeviceInfo"/> class.
+ /// Initializes a new instance of the <see cref="CameraDeviceInformation"/> class.
/// </summary>
/// <param name="type"><see cref="CameraDeviceType"/></param>
/// <param name="device"><see cref="CameraDevice"/></param>
/// <exception cref="ArgumentNullException">name or id is null.</exception>
/// <since_tizen> 9 </since_tizen>
[EditorBrowsable(EditorBrowsableState.Never)]
- internal CameraDeviceInfo(CameraDeviceType type, CameraDevice device, string name, string id)
+ internal CameraDeviceInformation(CameraDeviceType type, CameraDevice device, string name, string id)
{
ValidationUtil.ValidateEnum(typeof(CameraDeviceType), type, nameof(type));
ValidationUtil.ValidateEnum(typeof(CameraDevice), device, nameof(device));