/*
HostDeviceRecorderManager.java
Copyright (c) 2014 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.host.recorder;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.Camera;
import android.os.Build;
import org.deviceconnect.android.deviceplugin.host.HostDeviceService;
import org.deviceconnect.android.deviceplugin.host.mediaplayer.VideoConst;
import org.deviceconnect.android.deviceplugin.host.recorder.audio.HostDeviceAudioRecorder;
import org.deviceconnect.android.deviceplugin.host.recorder.camera.HostDeviceCameraRecorder;
import org.deviceconnect.android.deviceplugin.host.recorder.screen.HostDeviceScreenCast;
import org.deviceconnect.android.deviceplugin.host.recorder.video.HostDeviceVideoRecorder;
import org.deviceconnect.android.provider.FileManager;
import java.util.ArrayList;
import java.util.List;
/**
* Host Device Recorder Manager.
*
* @author NTT DOCOMO, INC.
*/
@SuppressWarnings("deprecation")
public class HostDeviceRecorderManager {
/** List of HostDeviceRecorder. */
private HostDeviceRecorder[] mRecorders;
/** HostDevicePhotoRecorder. */
private HostDeviceRecorder mDefaultPhotoRecorder;
/** HostDeviceAudioRecorder. */
private HostDeviceRecorder mDefaultVideoRecorder;
/** コンテキスト. */
private HostDeviceService mHostDeviceService;
public HostDeviceRecorderManager(final HostDeviceService service) {
mHostDeviceService = service;
}
public void createRecorders(final FileManager fileMgr) {
List<HostDeviceCameraRecorder> photoRecorders = new ArrayList<>();
List<HostDeviceVideoRecorder> videoRecorders = new ArrayList<>();
for (int cameraId = 0; cameraId < Camera.getNumberOfCameras(); cameraId++) {
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
HostDeviceCameraRecorder.CameraFacing facing;
switch (cameraInfo.facing) {
case Camera.CameraInfo.CAMERA_FACING_BACK:
facing = HostDeviceCameraRecorder.CameraFacing.BACK;
break;
case Camera.CameraInfo.CAMERA_FACING_FRONT:
facing = HostDeviceCameraRecorder.CameraFacing.FRONT;
break;
default:
facing = HostDeviceCameraRecorder.CameraFacing.UNKNOWN;
break;
}
photoRecorders.add(new HostDeviceCameraRecorder(mHostDeviceService, cameraId, facing, fileMgr));
videoRecorders.add(new HostDeviceVideoRecorder(mHostDeviceService, cameraId, facing));
}
if (!photoRecorders.isEmpty()) {
mDefaultPhotoRecorder = photoRecorders.get(0);
}
if (!videoRecorders.isEmpty()) {
mDefaultVideoRecorder = videoRecorders.get(0);
}
List<HostDeviceRecorder> recorders = new ArrayList<>();
recorders.addAll(photoRecorders);
recorders.addAll(videoRecorders);
recorders.add(new HostDeviceAudioRecorder(mHostDeviceService));
if (isSupportedMediaProjection()) {
recorders.add(new HostDeviceScreenCast(mHostDeviceService, fileMgr));
}
mRecorders = recorders.toArray(new HostDeviceRecorder[recorders.size()]);
}
public void initialize() {
for (HostDeviceRecorder recorder : getRecorders()) {
recorder.initialize();
}
}
public void clean() {
for (HostDeviceRecorder recorder : getRecorders()) {
recorder.clean();
}
}
public HostDeviceRecorder[] getRecorders() {
return mRecorders;
}
public HostDeviceRecorder getRecorder(final String id) {
if (id == null) {
return mDefaultPhotoRecorder;
}
for (HostDeviceRecorder recorder : mRecorders) {
if (id.equals(recorder.getId())) {
return recorder;
}
}
return null;
}
public HostDevicePhotoRecorder getCameraRecorder(final String id) {
if (id == null) {
return (HostDeviceCameraRecorder) mDefaultPhotoRecorder;
}
for (HostDeviceRecorder recorder : mRecorders) {
if (id.equals(recorder.getId()) && recorder instanceof HostDevicePhotoRecorder) {
return (HostDevicePhotoRecorder) recorder;
}
}
return null;
}
public HostDeviceStreamRecorder getStreamRecorder(final String id) {
if (id == null) {
return (HostDeviceStreamRecorder) mDefaultVideoRecorder;
}
for (HostDeviceRecorder recorder : mRecorders) {
if (id.equals(recorder.getId()) && recorder instanceof HostDeviceStreamRecorder) {
return (HostDeviceStreamRecorder) recorder;
}
}
return null;
}
public HostDevicePreviewServer getPreviewServer(final String id) {
if (id == null) {
return (HostDevicePreviewServer) mDefaultPhotoRecorder;
}
for (HostDeviceRecorder recorder : mRecorders) {
if (id.equals(recorder.getId()) && recorder instanceof HostDevicePreviewServer) {
return (HostDevicePreviewServer) recorder;
}
}
return null;
}
public void start() {
IntentFilter filter = new IntentFilter(VideoConst.SEND_VIDEO_TO_HOSTDP);
getContext().registerReceiver(mRecorderStateReceiver, filter);
}
public void stop() {
getContext().unregisterReceiver(mRecorderStateReceiver);
}
public void stopWebServer(final String id) {
if (id == null) {
return;
}
HostDeviceRecorder recorder = getRecorder(id);
if (recorder != null && recorder instanceof HostDevicePreviewServer) {
((HostDevicePreviewServer)recorder).stopWebServer();
}
}
private boolean isSupportedMediaProjection() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
}
private Context getContext() {
return mHostDeviceService;
}
private HostDeviceVideoRecorder getVideoRecorder(final String id) {
for (HostDeviceRecorder recorder : mRecorders) {
if (id.equals(recorder.getId()) && recorder instanceof HostDeviceVideoRecorder) {
return (HostDeviceVideoRecorder) recorder;
}
}
return null;
}
private final BroadcastReceiver mRecorderStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
if (VideoConst.SEND_VIDEO_TO_HOSTDP.equals(intent.getAction())) {
String target = intent.getStringExtra(VideoConst.EXTRA_RECORDER_ID);
HostDeviceRecorder.RecorderState state =
(HostDeviceRecorder.RecorderState) intent.getSerializableExtra(VideoConst.EXTRA_VIDEO_RECORDER_STATE);
if (target != null && state != null) {
HostDeviceVideoRecorder videoRecorder = getVideoRecorder(target);
if (videoRecorder != null) {
videoRecorder.setState(state);
}
}
}
}
};
}