1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "android_webview/native/permission/media_access_permission_request.h"
6
7#include "android_webview/native/permission/aw_permission_request.h"
8#include "content/public/browser/media_capture_devices.h"
9
10using content::MediaCaptureDevices;
11using content::MediaStreamDevice;
12using content::MediaStreamDevices;
13
14namespace android_webview {
15
16namespace {
17
18// Return the device specified by |device_id| if exists, otherwise the first
19// available device is returned.
20const MediaStreamDevice* GetDeviceByIdOrFirstAvailable(
21    const MediaStreamDevices& devices,
22    const std::string& device_id) {
23  if (devices.empty())
24    return NULL;
25
26  if (!device_id.empty()) {
27    for (size_t i = 0; i < devices.size(); ++i) {
28      if (devices[i].id == device_id)
29        return &devices[i];
30    }
31  }
32
33  return &devices[0];
34}
35
36}  // namespace
37
38MediaAccessPermissionRequest::MediaAccessPermissionRequest(
39    const content::MediaStreamRequest& request,
40    const content::MediaResponseCallback& callback)
41    : request_(request),
42      callback_(callback) {
43}
44
45MediaAccessPermissionRequest::~MediaAccessPermissionRequest() {
46}
47
48void MediaAccessPermissionRequest::NotifyRequestResult(bool allowed) {
49  scoped_ptr<content::MediaStreamUI> ui;
50  MediaStreamDevices devices;
51  if (!allowed) {
52    callback_.Run(devices, content::MEDIA_DEVICE_PERMISSION_DENIED, ui.Pass());
53    return;
54  }
55
56  if (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE) {
57    const MediaStreamDevices& audio_devices = audio_test_devices_.empty()?
58        MediaCaptureDevices::GetInstance()->GetAudioCaptureDevices() :
59        audio_test_devices_;
60    const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable(
61        audio_devices, request_.requested_audio_device_id);
62    if (device)
63      devices.push_back(*device);
64  }
65
66  if (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE) {
67    const MediaStreamDevices& video_devices = video_test_devices_.empty()?
68        MediaCaptureDevices::GetInstance()->GetVideoCaptureDevices() :
69        video_test_devices_;
70    const MediaStreamDevice* device = GetDeviceByIdOrFirstAvailable(
71        video_devices, request_.requested_video_device_id);
72    if (device)
73      devices.push_back(*device);
74  }
75  callback_.Run(devices, devices.empty() ?
76                content::MEDIA_DEVICE_NO_HARDWARE : content::MEDIA_DEVICE_OK,
77                ui.Pass());
78}
79
80const GURL& MediaAccessPermissionRequest::GetOrigin() {
81  return request_.security_origin;
82}
83
84int64 MediaAccessPermissionRequest::GetResources() {
85  return (request_.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE ?
86          AwPermissionRequest::AudioCapture : 0) |
87      (request_.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE ?
88       AwPermissionRequest::VideoCapture : 0);
89}
90
91}  // namespace android_webview
92