blob: d286932815bb6e5ba03e21f06a3373dd85c2cfe5 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/media/android/desktop_media_picker_android.h"
#include "chrome/browser/media/android/media_capture_picker_dialog_bridge.h"
#include "chrome/browser/media/webrtc/desktop_media_picker_manager.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
DesktopMediaPickerAndroid::DesktopMediaPickerAndroid() = default;
DesktopMediaPickerAndroid::~DesktopMediaPickerAndroid() = default;
void DesktopMediaPickerAndroid::Show(
const DesktopMediaPicker::Params& params,
std::vector<std::unique_ptr<DesktopMediaList>> source_lists,
DoneCallback done_callback) {
CHECK(callback_.is_null());
DesktopMediaPickerManager::Get()->OnShowDialog(params);
callback_ = std::move(done_callback);
// We outlive `dialog_bridge_` so it can take a raw pointer to us.
dialog_bridge_.Show(
params.web_contents, params.app_name, params.request_audio,
base::BindOnce(&DesktopMediaPickerAndroid::NotifyDialogResult,
base::Unretained(this)));
}
void DesktopMediaPickerAndroid::NotifyDialogResult(
DoneCallbackArgumentType source) {
auto callback = std::move(callback_);
DesktopMediaPickerManager::Get()->OnHideDialog();
if (callback.is_null()) {
return;
}
// Notify the |callback_| asynchronously because it may need to destroy
// DesktopMediaPicker.
content::GetUIThreadTaskRunner({})->PostTask(
FROM_HERE, base::BindOnce(std::move(callback), std::move(source)));
}
// static
std::unique_ptr<DesktopMediaPicker> DesktopMediaPicker::Create(
const content::MediaStreamRequest* request) {
return std::make_unique<DesktopMediaPickerAndroid>();
}