Skip to content

Commit 9ecbc22

Browse files
Merge branch 'modify_host_camera_front_or_back' into modify_livestreaming_screen
2 parents 6e18fbc + 525ce94 commit 9ecbc22

10 files changed

Lines changed: 119 additions & 84 deletions

File tree

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/profile/HostLightProfile.java

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,6 @@ public boolean onRequest(final Intent request, final Intent response) {
8989
new PermissionUtility.PermissionRequestCallback() {
9090
@Override
9191
public void onSuccess() {
92-
if (!(isCameraAvailable())) {
93-
MessageUtils.setIllegalDeviceStateError(response, "Camera device is already running.");
94-
sendResponse(response);
95-
return;
96-
}
97-
9892
Bundle lightParam = new Bundle();
9993
setName(lightParam, HOST_DEFAULT_LIGHT_NAME);
10094
setConfig(lightParam, "");
@@ -144,12 +138,6 @@ public boolean onRequest(final Intent request, final Intent response) {
144138
new PermissionUtility.PermissionRequestCallback() {
145139
@Override
146140
public void onSuccess() {
147-
if (!(isCameraAvailable())) {
148-
MessageUtils.setIllegalDeviceStateError(response, "Camera device is already running.");
149-
sendResponse(response);
150-
return;
151-
}
152-
153141
if (flashing != null) {
154142
flashing(HOST_LIGHT_ID, flashing);
155143
setResult(response, DConnectMessage.RESULT_OK);
@@ -213,12 +201,6 @@ public boolean onRequest(final Intent request, final Intent response) {
213201
new PermissionUtility.PermissionRequestCallback() {
214202
@Override
215203
public void onSuccess() {
216-
if (!(isCameraAvailable())) {
217-
MessageUtils.setIllegalDeviceStateError(response, "Camera device is already running.");
218-
sendResponse(response);
219-
return;
220-
}
221-
222204
mPhotoRec.turnOffFlashLight(new HostDevicePhotoRecorder.TurnOffFlashLightListener() {
223205
@Override
224206
public void onRequested() {
@@ -294,18 +276,6 @@ private Handler createHandler(final String name) {
294276
return new Handler(thread.getLooper());
295277
}
296278

297-
/**
298-
* カメラが使用可能どうかをチェックする.
299-
*
300-
* @return 使用可能の場合は true, そうでない場合は false.
301-
*/
302-
private boolean isCameraAvailable() {
303-
if (((HostMediaRecorder) mPhotoRec).getState() != HostMediaRecorder.RecorderState.INACTTIVE) {
304-
return false;
305-
}
306-
return true;
307-
}
308-
309279
/**
310280
* 点滅制御.
311281
*

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/profile/HostLiveStreamingProfile.java

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ public class HostLiveStreamingProfile extends DConnectProfile implements LiveStr
4848
private static final String VIDEO_URI_FALSE = "false";
4949
private static final String VIDEO_URI_CAMERA_FRONT = "camera-front";
5050
private static final String VIDEO_URI_CAMERA_BACK = "camera-back";
51+
private static final String VIDEO_URI_CAMERA_0 = "camera_0";
52+
private static final String VIDEO_URI_CAMERA_1 = "camera_1";
5153
private static final String AUDIO_URI_TRUE = "true";
5254
private static final String AUDIO_URI_FALSE = "false";
5355
private static final int CAMERA_TYPE_FRONT = 0;
@@ -108,6 +110,8 @@ public boolean onRequest(final Intent request, final Intent response) {
108110
case VIDEO_URI_FALSE:
109111
case VIDEO_URI_CAMERA_FRONT:
110112
case VIDEO_URI_CAMERA_BACK:
113+
case VIDEO_URI_CAMERA_0:
114+
case VIDEO_URI_CAMERA_1:
111115
break;
112116
default:
113117
MessageUtils.setInvalidRequestParameterError(response, "video parameter illegal");
@@ -353,35 +357,42 @@ public boolean onRequest(final Intent request, final Intent response) {
353357
});
354358
}
355359

356-
private HostDeviceLiveStreamRecorder getHostDeviceLiveStreamRecorder() {
360+
private HostDeviceLiveStreamRecorder getHostDeviceLiveStreamRecorder() {
357361
if (DEBUG) {
358362
Log.d(TAG, "getHostDeviceLiveStreamRecorder()");
359363
Log.d(TAG, "mVideoURI : " + mVideoURI);
360364
}
361365
switch (mVideoURI) {
362-
case VIDEO_URI_TRUE: {
363-
HostMediaRecorder hostMediaRecorder = mHostMediaRecorderManager.getRecorder(null);
364-
if (hostMediaRecorder instanceof HostDeviceLiveStreamRecorder) {
365-
return (HostDeviceLiveStreamRecorder) hostMediaRecorder;
366-
}
367-
break;
368-
}
366+
case VIDEO_URI_TRUE:
369367
case VIDEO_URI_FALSE: {
370368
HostMediaRecorder hostMediaRecorder = mHostMediaRecorderManager.getRecorder(null);
369+
if (mHostMediaRecorderManager.usingStreamingRecorder()) {
370+
throw new RuntimeException("Another target in using.");
371+
}
372+
371373
if (hostMediaRecorder instanceof HostDeviceLiveStreamRecorder) {
372374
return (HostDeviceLiveStreamRecorder) hostMediaRecorder;
373375
}
374376
break;
375377
}
376-
case VIDEO_URI_CAMERA_FRONT: {
377-
HostMediaRecorder hostMediaRecorder = getRecorder(CAMERA_TYPE_FRONT);
378+
case VIDEO_URI_CAMERA_FRONT:
379+
case VIDEO_URI_CAMERA_1: {
380+
HostMediaRecorder hostMediaRecorder = mHostMediaRecorderManager.getRecorder(VIDEO_URI_CAMERA_1);
381+
if (mHostMediaRecorderManager.usingStreamingRecorder()) {
382+
throw new RuntimeException("Another target in using.");
383+
}
378384
if (hostMediaRecorder instanceof HostDeviceLiveStreamRecorder) {
379385
return (HostDeviceLiveStreamRecorder) hostMediaRecorder;
380386
}
381387
break;
382388
}
383-
case VIDEO_URI_CAMERA_BACK: {
384-
HostMediaRecorder hostMediaRecorder = getRecorder(CAMERA_TYPE_BACK);
389+
case VIDEO_URI_CAMERA_BACK:
390+
case VIDEO_URI_CAMERA_0: {
391+
HostMediaRecorder hostMediaRecorder = mHostMediaRecorderManager.getRecorder(VIDEO_URI_CAMERA_0);
392+
if (mHostMediaRecorderManager.usingPreviewOrStreamingRecorder(hostMediaRecorder.getId())) {
393+
throw new RuntimeException("Another target in using.");
394+
}
395+
385396
if (hostMediaRecorder instanceof HostDeviceLiveStreamRecorder) {
386397
return (HostDeviceLiveStreamRecorder) hostMediaRecorder;
387398
}
@@ -392,31 +403,6 @@ private HostDeviceLiveStreamRecorder getHostDeviceLiveStreamRecorder() {
392403
throw new RuntimeException("recorder not found");
393404
}
394405

395-
396-
private HostMediaRecorder getRecorder(int type) {
397-
if (DEBUG) {
398-
Log.d(TAG, "getRecorder()");
399-
Log.d(TAG, "type" + type);
400-
}
401-
for(HostMediaRecorder hostMediaRecorder : mHostMediaRecorderManager.getRecorders()) {
402-
if (DEBUG) {
403-
Log.d(TAG, "name : " + hostMediaRecorder.getName());
404-
}
405-
if (hostMediaRecorder.getName().matches("^Camera [0-9] \\((Front|Back)\\)")) {
406-
if (type == CAMERA_TYPE_FRONT) {
407-
if (hostMediaRecorder.getName().contains("Front")) {
408-
return hostMediaRecorder;
409-
}
410-
} else if (type == CAMERA_TYPE_BACK) {
411-
if (hostMediaRecorder.getName().contains("Back")) {
412-
return hostMediaRecorder;
413-
}
414-
}
415-
}
416-
}
417-
return null;
418-
}
419-
420406
@Override
421407
public void onStart() {
422408
if (DEBUG) {

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/profile/HostMediaStreamingRecordingProfile.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ private void setOptions(final Intent request, final Intent response) {
218218
return;
219219
}
220220

221-
if (recorder.getState() != HostMediaRecorder.RecorderState.INACTTIVE) {
221+
if (recorder.getState() != HostMediaRecorder.RecorderState.INACTIVE
222+
&& recorder.getState() != HostMediaRecorder.RecorderState.PREVIEW) {
222223
MessageUtils.setInvalidRequestParameterError(response, "settings of active target cannot be changed.");
223224
return;
224225
}
@@ -431,6 +432,10 @@ public boolean onRequest(final Intent request, final Intent response) {
431432
MessageUtils.setInvalidRequestParameterError(response, "target is invalid.");
432433
return true;
433434
}
435+
if (mRecorderMgr.usingPreviewOrStreamingRecorder(recorder.getId())) {
436+
MessageUtils.setInvalidRequestParameterError(response, "Another target in using.");
437+
return true;
438+
}
434439

435440
if (!(recorder instanceof HostDevicePhotoRecorder)) {
436441
MessageUtils.setNotSupportAttributeError(response,
@@ -501,7 +506,10 @@ public boolean onRequest(final Intent request, final Intent response) {
501506
MessageUtils.setInvalidRequestParameterError(response, "target is invalid.");
502507
return true;
503508
}
504-
509+
if (mRecorderMgr.usingPreviewOrStreamingRecorder(recorder.getId())) {
510+
MessageUtils.setInvalidRequestParameterError(response, "Another target in using.");
511+
return true;
512+
}
505513
recorder.requestPermission(new HostMediaRecorder.PermissionCallback() {
506514
@Override
507515
public void onAllowed() {
@@ -559,7 +567,6 @@ public boolean onRequest(final Intent request, final Intent response) {
559567
MessageUtils.setInvalidRequestParameterError(response, "target is invalid.");
560568
return true;
561569
}
562-
563570
recorder.requestPermission(new HostMediaRecorder.PermissionCallback() {
564571
@Override
565572
public void onAllowed() {
@@ -678,14 +685,18 @@ public boolean onRequest(final Intent request, final Intent response) {
678685
MessageUtils.setInvalidRequestParameterError(response, "target is invalid.");
679686
return true;
680687
}
688+
if (mRecorderMgr.usingPreviewOrStreamingRecorder(recorder.getId())) {
689+
MessageUtils.setInvalidRequestParameterError(response, "Another target in using.");
690+
return true;
691+
}
681692

682693
if (!(recorder instanceof HostDeviceStreamRecorder)) {
683694
MessageUtils.setNotSupportAttributeError(response,
684695
"target does not support stream recording.");
685696
return true;
686697
}
687698

688-
if (recorder.getState() != HostMediaRecorder.RecorderState.INACTTIVE) {
699+
if (recorder.getState() != HostMediaRecorder.RecorderState.INACTIVE) {
689700
MessageUtils.setIllegalDeviceStateError(response,
690701
recorder.getName() + " is already running.");
691702
return true;
@@ -744,14 +755,13 @@ public boolean onRequest(final Intent request, final Intent response) {
744755
MessageUtils.setInvalidRequestParameterError(response, "target is invalid.");
745756
return true;
746757
}
747-
748758
if (!(recorder instanceof HostDeviceStreamRecorder)) {
749759
MessageUtils.setNotSupportAttributeError(response,
750760
"target does not support stream recording.");
751761
return true;
752762
}
753763

754-
if (recorder.getState() == HostMediaRecorder.RecorderState.INACTTIVE) {
764+
if (recorder.getState() == HostMediaRecorder.RecorderState.INACTIVE) {
755765
MessageUtils.setIllegalDeviceStateError(response, "recorder is stopped already.");
756766
return true;
757767
}
@@ -907,7 +917,6 @@ public void onDisallowed() {
907917
public HostMediaStreamingRecordingProfile(final HostMediaRecorderManager mgr, final FileManager fileMgr) {
908918
mRecorderMgr = mgr;
909919
mFileManager = fileMgr;
910-
911920
addApi(mGetMediaRecorderApi);
912921
addApi(mGetOptionsApi);
913922
addApi(mPutOptionsApi);

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/AbstractPreviewServerProvider.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public abstract class AbstractPreviewServerProvider implements PreviewServerProv
5252
*/
5353
private HostMediaRecorder mRecorder;
5454

55+
private boolean mIsShownNotification;
5556
/**
5657
* コンストラクタ.
5758
* @param context コンテキスト
@@ -60,6 +61,7 @@ public AbstractPreviewServerProvider(final Context context, final HostMediaRecor
6061
mContext = context;
6162
mRecorder = recorder;
6263
mNotificationId = notificationId;
64+
mIsShownNotification = false;
6365
}
6466

6567
// PreviewServerProvider
@@ -118,6 +120,7 @@ public void onFail() {
118120
// TODO タイムアウト処理
119121
} else {
120122
sendNotification(mRecorder.getId(), mRecorder.getName());
123+
mIsShownNotification = true;
121124
}
122125
} catch (InterruptedException e) {
123126
// ignore.
@@ -171,6 +174,7 @@ private void hideNotification(String id) {
171174
.getSystemService(Service.NOTIFICATION_SERVICE);
172175
if (manager != null) {
173176
manager.cancel(id, getNotificationId());
177+
mIsShownNotification = false;
174178
}
175179
}
176180

@@ -252,4 +256,9 @@ private PendingIntent createPendingIntent(String id) {
252256
intent.putExtra(EXTRA_CAMERA_ID, id);
253257
return PendingIntent.getBroadcast(mContext, getNotificationId(), intent, 0);
254258
}
259+
260+
@Override
261+
public boolean isShownCameraNotification() {
262+
return mIsShownNotification;
263+
}
255264
}

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/HostMediaRecorder.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ enum RecorderState {
287287
/**
288288
* 動作していない.
289289
*/
290-
INACTTIVE,
290+
INACTIVE,
291291

292292
/**
293293
* 録画が一時停止中の状態.
@@ -299,6 +299,11 @@ enum RecorderState {
299299
*/
300300
RECORDING,
301301

302+
/**
303+
* プレビューが表示されている状態.
304+
*/
305+
PREVIEW,
306+
302307
/**
303308
* エラーで停止している状態.
304309
*/

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/HostMediaRecorderManager.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,52 @@ public HostMediaRecorder getRecorder(final String id) {
235235
return null;
236236
}
237237

238+
/**
239+
* 指定された ID 以外のレコーダが.
240+
*
241+
* <p>
242+
* id に null が指定された場合には、デフォルトに設定されているレコーダを返却します。
243+
* </p>
244+
*
245+
* @param id レコーダの識別子
246+
* @return 他のレコーダーが使用中であるかどうか true:使用中 false:使用されていない
247+
*/
248+
public boolean usingPreviewOrStreamingRecorder(String id) {
249+
if (mRecorders.size() == 0) {
250+
return false;
251+
}
252+
if (id == null) {
253+
if (mDefaultPhotoRecorder != null) {
254+
id = mDefaultPhotoRecorder.getId();
255+
} else {
256+
id = mRecorders.get(0).getId();
257+
}
258+
}
259+
for (HostMediaRecorder recorder : mRecorders) {
260+
if (!id.equals(recorder.getId())
261+
&& (recorder.getState() == HostMediaRecorder.RecorderState.PREVIEW
262+
|| recorder.getState() == HostMediaRecorder.RecorderState.RECORDING)) {
263+
return true;
264+
} else if (recorder instanceof HostDeviceLiveStreamRecorder
265+
&& ((HostDeviceLiveStreamRecorder) recorder).isStreaming()) {
266+
return true;
267+
}
268+
}
269+
return false;
270+
}
271+
/**
272+
* レコーダーが使用中である、あるいはストリーミングが開始している場合はtrueを返す.
273+
*
274+
* @return true:使用中 false:使用されていない
275+
*/
276+
public boolean usingStreamingRecorder() {
277+
for (HostMediaRecorder recorder : mRecorders) {
278+
return recorder.getState() == HostMediaRecorder.RecorderState.PREVIEW
279+
|| recorder.getState() == HostMediaRecorder.RecorderState.RECORDING
280+
|| ((HostDeviceLiveStreamRecorder) recorder).isStreaming();
281+
}
282+
return false;
283+
}
238284
/**
239285
* 指定された ID に対応する静止画用のレコーダを取得します.
240286
*
@@ -311,7 +357,7 @@ public void sendEventForRecordingChange(final String serviceId, final HostMediaR
311357
case RECORDING:
312358
MediaStreamRecordingProfile.setStatus(record, MediaStreamRecordingProfileConstants.RecordingState.RECORDING);
313359
break;
314-
case INACTTIVE:
360+
case INACTIVE:
315361
MediaStreamRecordingProfile.setStatus(record, MediaStreamRecordingProfileConstants.RecordingState.STOP);
316362
break;
317363
case ERROR:

dConnectDevicePlugin/dConnectDeviceHost/app/src/main/java/org/deviceconnect/android/deviceplugin/host/recorder/PreviewServerProvider.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,10 @@ public interface PreviewServerProvider {
7373
* 設定が変更されたことを通知します.
7474
*/
7575
void onConfigChange();
76+
77+
/**
78+
* Previewの状態を表すNotificationが表示されているかどうかのフラグを返します.
79+
* return true:表示されている false:表示されていない
80+
*/
81+
boolean isShownCameraNotification();
7682
}

0 commit comments

Comments
 (0)