| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/webui/options/media_devices_selection_handler.h" |
| |
| #include "base/bind.h" |
| #include "base/prefs/pref_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/common/pref_names.h" |
| |
| namespace { |
| |
| const char kAudio[] = "mic"; |
| const char kVideo[] = "camera"; |
| |
| } // namespace |
| |
| namespace options { |
| |
| MediaDevicesSelectionHandler::MediaDevicesSelectionHandler() {} |
| |
| MediaDevicesSelectionHandler::~MediaDevicesSelectionHandler() { |
| MediaCaptureDevicesDispatcher::GetInstance()->RemoveObserver(this); |
| } |
| |
| void MediaDevicesSelectionHandler::GetLocalizedValues( |
| base::DictionaryValue* values) { |
| DCHECK(values); |
| |
| static OptionsStringResource resources[] = { |
| { "mediaSelectMicLabel", IDS_MEDIA_SELECTED_MIC_LABEL }, |
| { "mediaSelectCameraLabel", IDS_MEDIA_SELECTED_CAMERA_LABEL }, |
| }; |
| |
| RegisterStrings(values, resources, arraysize(resources)); |
| } |
| |
| void MediaDevicesSelectionHandler::InitializePage() { |
| // Register to the device observer list to get up-to-date device lists. |
| MediaCaptureDevicesDispatcher::GetInstance()->AddObserver(this); |
| |
| // Update the device selection menus. |
| UpdateDevicesMenuForType(AUDIO); |
| UpdateDevicesMenuForType(VIDEO); |
| } |
| |
| void MediaDevicesSelectionHandler::RegisterMessages() { |
| web_ui()->RegisterMessageCallback("setDefaultCaptureDevice", |
| base::Bind(&MediaDevicesSelectionHandler::SetDefaultCaptureDevice, |
| base::Unretained(this))); |
| } |
| |
| void MediaDevicesSelectionHandler::OnUpdateAudioDevices( |
| const content::MediaStreamDevices& devices) { |
| UpdateDevicesMenu(AUDIO, devices); |
| } |
| |
| void MediaDevicesSelectionHandler::OnUpdateVideoDevices( |
| const content::MediaStreamDevices& devices) { |
| UpdateDevicesMenu(VIDEO, devices); |
| } |
| |
| void MediaDevicesSelectionHandler::SetDefaultCaptureDevice( |
| const base::ListValue* args) { |
| DCHECK_EQ(2U, args->GetSize()); |
| std::string type, device; |
| if (!(args->GetString(0, &type) && args->GetString(1, &device))) { |
| NOTREACHED(); |
| return; |
| } |
| |
| DCHECK(!type.empty()); |
| DCHECK(!device.empty()); |
| |
| Profile* profile = Profile::FromWebUI(web_ui()); |
| PrefService* prefs = profile->GetPrefs(); |
| if (type == kAudio) |
| prefs->SetString(prefs::kDefaultAudioCaptureDevice, device); |
| else if (type == kVideo) |
| prefs->SetString(prefs::kDefaultVideoCaptureDevice, device); |
| else |
| NOTREACHED(); |
| } |
| |
| void MediaDevicesSelectionHandler::UpdateDevicesMenu( |
| DeviceType type, const content::MediaStreamDevices& devices) { |
| // Get the default device unique id from prefs. |
| Profile* profile = Profile::FromWebUI(web_ui()); |
| PrefService* prefs = profile->GetPrefs(); |
| std::string default_device; |
| std::string device_type; |
| switch (type) { |
| case AUDIO: |
| default_device = prefs->GetString(prefs::kDefaultAudioCaptureDevice); |
| device_type = kAudio; |
| break; |
| case VIDEO: |
| default_device = prefs->GetString(prefs::kDefaultVideoCaptureDevice); |
| device_type = kVideo; |
| break; |
| } |
| |
| // Build the list of devices to send to JS. |
| std::string default_id; |
| base::ListValue device_list; |
| for (size_t i = 0; i < devices.size(); ++i) { |
| base::DictionaryValue* entry = new base::DictionaryValue(); |
| entry->SetString("name", devices[i].name); |
| entry->SetString("id", devices[i].id); |
| device_list.Append(entry); |
| if (devices[i].id == default_device) |
| default_id = default_device; |
| } |
| |
| // Use the first device as the default device if the preferred default device |
| // does not exist in the OS. |
| if (!devices.empty() && default_id.empty()) |
| default_id = devices[0].id; |
| |
| base::StringValue default_value(default_id); |
| base::StringValue type_value(device_type); |
| web_ui()->CallJavascriptFunction("ContentSettings.updateDevicesMenu", |
| type_value, |
| device_list, |
| default_value); |
| } |
| |
| void MediaDevicesSelectionHandler::UpdateDevicesMenuForType(DeviceType type) { |
| content::MediaStreamDevices devices; |
| switch (type) { |
| case AUDIO: |
| devices = MediaCaptureDevicesDispatcher::GetInstance()-> |
| GetAudioCaptureDevices(); |
| break; |
| case VIDEO: |
| devices = MediaCaptureDevicesDispatcher::GetInstance()-> |
| GetVideoCaptureDevices(); |
| break; |
| } |
| |
| UpdateDevicesMenu(type, devices); |
| } |
| |
| } // namespace options |