1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_LIVE_CAPTION_LIVE_CAPTION_CONTROLLER_H_
#define COMPONENTS_LIVE_CAPTION_LIVE_CAPTION_CONTROLLER_H_
#include <memory>
#include <optional>
#include "base/functional/callback_forward.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/live_caption/caption_controller_base.h"
#include "components/live_caption/views/caption_bubble.h"
#include "components/soda/constants.h"
#include "components/soda/soda_installer.h"
#include "ui/native_theme/caption_style.h"
#include "ui/native_theme/native_theme_observer.h"
namespace content {
class BrowserContext;
}
namespace user_prefs {
class PrefRegistrySyncable;
}
namespace captions {
class CaptionBubbleController;
class CaptionBubbleContext;
class LiveCaptionBubbleSettings;
///////////////////////////////////////////////////////////////////////////////
// Live Caption Controller
//
// The controller of the live caption feature. It enables the captioning
// service when the preference is enabled. The live caption controller is a
// KeyedService. There exists one live caption controller per profile and it
// lasts for the duration of the session. The live caption controller owns the
// live caption UI, which is a caption bubble controller.
//
class LiveCaptionController : public KeyedService,
public speech::SodaInstaller::Observer,
public CaptionControllerBase {
public:
LiveCaptionController(
PrefService* profile_prefs,
PrefService* global_prefs,
const std::string& application_locale,
content::BrowserContext* browser_context,
std::unique_ptr<CaptionControllerBase::Delegate> delegate = nullptr);
~LiveCaptionController() override;
LiveCaptionController(const LiveCaptionController&) = delete;
LiveCaptionController& operator=(const LiveCaptionController&) = delete;
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Alerts the CaptionBubbleController that there is an error in the speech
// recognition service.
void OnError(CaptionBubbleContext* caption_bubble_context,
CaptionBubbleErrorType error_type,
OnErrorClickedCallback error_clicked_callback,
OnDoNotShowAgainClickedCallback error_silenced_callback);
// Mac and ChromeOS move the fullscreened window into a new workspace. When
// the WebContents associated with the CaptionBubbleContext goes
// fullscreen, ensure that the Live Caption bubble moves to the new workspace.
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS)
void OnToggleFullscreen(CaptionBubbleContext* caption_bubble_context);
#endif
CaptionBubbleController* caption_bubble_controller_for_testing() {
return caption_bubble_controller();
}
private:
// CaptionControllerBase:
CaptionBubbleSettings* caption_bubble_settings() override;
// SodaInstaller::Observer:
void OnSodaInstalled(speech::LanguageCode language_code) override;
void OnSodaProgress(speech::LanguageCode language_code,
int progress) override {}
void OnSodaInstallError(speech::LanguageCode language_code,
speech::SodaInstaller::ErrorCode error_code) override;
void OnLiveCaptionEnabledChanged();
void OnLiveCaptionLanguageChanged();
bool IsLiveCaptionEnabled();
void StartLiveCaption();
void StopLiveCaption();
const std::string GetLanguageCode() const;
void MaybeSetLiveCaptionLanguage();
raw_ptr<PrefService> global_prefs_ = nullptr;
raw_ptr<content::BrowserContext> browser_context_ = nullptr;
const std::unique_ptr<LiveCaptionBubbleSettings> caption_bubble_settings_;
// Whether Live Caption is enabled.
bool enabled_ = false;
};
} // namespace captions
#endif // COMPONENTS_LIVE_CAPTION_LIVE_CAPTION_CONTROLLER_H_
|