// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_CHROMEOS_VIDEO_CONFERENCE_VIDEO_CONFERENCE_WEB_APP_H_
#define CHROME_BROWSER_CHROMEOS_VIDEO_CONFERENCE_VIDEO_CONFERENCE_WEB_APP_H_
#include <memory>
#include "base/functional/callback_forward.h"
#include "chrome/browser/chromeos/video_conference/video_conference_manager_client_common.h"
#include "chrome/browser/chromeos/video_conference/video_conference_ukm_helper.h"
#include "chromeos/crosapi/mojom/video_conference.mojom-forward.h"
#include "chromeos/crosapi/mojom/video_conference.mojom.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
namespace base {
class UnguessableToken;
} // namespace base
namespace content {
class Page;
class RenderWidgetHost;
class WebContents;
} // namespace content
namespace video_conference {
struct VideoConferencePermissions;
// This class stores information about videoconferencing web apps for
// `VideoConferenceManagerClient`s. A VC webapp is an open page that has
// captured or is capturing the microphone, camera, or screen.
//
// This class also tracks the destruction of its corresponding webcontents or a
// change to the primary page for its `VideoConferenceManagerClient`.
//
// NOTE: we treat `PrimaryPageChanged()` as a new VcWebApp and hence remove the
// old one from the client.
class VideoConferenceWebApp
: public content::WebContentsObserver,
public content::WebContentsUserData<VideoConferenceWebApp> {
public:
VideoConferenceWebApp(const VideoConferenceWebApp&) = delete;
VideoConferenceWebApp& operator=(const VideoConferenceWebApp&) = delete;
~VideoConferenceWebApp() override;
// Brings the associated tab into focus.
void ActivateApp();
// Returns a pair containing the (camera, microphone) permissions granted
// status for this app.
VideoConferencePermissions GetPermissions();
// Returns bool indicating whether the VC webapp is an extension and is not
// capturing camera, microphone, or screen.
bool IsInactiveExtension();
// content::WebcontentsObserver overrides
void OnWebContentsFocused(
content::RenderWidgetHost* render_widget_host) override;
void WebContentsDestroyed() override;
void PrimaryPageChanged(content::Page& page) override;
void TitleWasSet(content::NavigationEntry* entry) override;
// Set capturing status in state for the specified media device. This method
// is also responsible for updating data needed for UKM reporting.
void SetCapturingStatus(VideoConferenceMediaType device, bool is_capturing);
VideoConferenceWebAppState& state() { return state_; }
private:
friend class WebContentsUserData<VideoConferenceWebApp>;
// `remove_media_app_callback` is called on `WebContentsDestroyed()` or
// `PrimaryPageChanged()`.
VideoConferenceWebApp(
content::WebContents* web_contents,
base::UnguessableToken id,
base::RepeatingCallback<void(const base::UnguessableToken&)>
remove_media_app_callback,
base::RepeatingCallback<
void(crosapi::mojom::VideoConferenceClientUpdatePtr)>
client_update_callback);
// This callback corresponds to a method on a
// `VideoConferenceManagerClientImpl`. It is safe to call even if the client
// has been destroyed.
base::RepeatingCallback<void(const base::UnguessableToken&)>
remove_media_app_callback_;
// Callback to send a new client update.
base::RepeatingCallback<void(crosapi::mojom::VideoConferenceClientUpdatePtr)>
client_update_callback_;
VideoConferenceWebAppState state_;
std::unique_ptr<VideoConferenceUkmHelper> vc_ukm_helper_;
WEB_CONTENTS_USER_DATA_KEY_DECL();
};
} // namespace video_conference
#endif // CHROME_BROWSER_CHROMEOS_VIDEO_CONFERENCE_VIDEO_CONFERENCE_WEB_APP_H_