blob: 90da7a46df3c993ae497d24f4ef85a0a4f2ce999 [file] [log] [blame]
// Copyright 2021 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.
#ifndef CHROME_BROWSER_UI_ASH_PROJECTOR_PROJECTOR_CLIENT_IMPL_H_
#define CHROME_BROWSER_UI_ASH_PROJECTOR_PROJECTOR_CLIENT_IMPL_H_
#include <memory>
#include "ash/public/cpp/projector/projector_annotator_controller.h"
#include "ash/public/cpp/projector/projector_client.h"
#include "ash/public/cpp/projector/projector_controller.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "chrome/browser/ash/drive/drive_integration_service.h"
#include "chrome/browser/speech/speech_recognizer_delegate.h"
#include "components/prefs/pref_change_registrar.h"
#include "components/session_manager/core/session_manager.h"
#include "components/session_manager/core/session_manager_observer.h"
#include "components/soda/constants.h"
#include "components/soda/soda_installer.h"
#include "components/user_manager/user_manager.h"
namespace views {
class WebView;
} // namespace views
class OnDeviceSpeechRecognizer;
// The client implementation for the ProjectorController in ash/. This client is
// responsible for handling requests that have browser dependencies.
class ProjectorClientImpl
: public ash::ProjectorClient,
public SpeechRecognizerDelegate,
public ash::ProjectorAnnotatorController,
public drive::DriveIntegrationServiceObserver,
public session_manager::SessionManagerObserver,
public user_manager::UserManager::UserSessionStateObserver {
public:
// RecordingOverlayViewImpl calls this function to initialize the annotator
// tool.
static void InitForProjectorAnnotator(views::WebView* web_view);
explicit ProjectorClientImpl(ash::ProjectorController* controller);
ProjectorClientImpl();
ProjectorClientImpl(const ProjectorClientImpl&) = delete;
ProjectorClientImpl& operator=(const ProjectorClientImpl&) = delete;
~ProjectorClientImpl() override;
// ash::ProjectorClient:
void StartSpeechRecognition() override;
void StopSpeechRecognition() override;
bool GetDriveFsMountPointPath(base::FilePath* result) const override;
bool IsDriveFsMounted() const override;
bool IsDriveFsMountFailed() const override;
void OpenProjectorApp() const override;
void MinimizeProjectorApp() const override;
void CloseProjectorApp() const override;
void OnNewScreencastPreconditionChanged(
const ash::NewScreencastPrecondition& precondition) const override;
// SpeechRecognizerDelegate:
void OnSpeechResult(
const std::u16string& text,
bool is_final,
const absl::optional<media::SpeechRecognitionResult>& timing) override;
// This class is not utilizing the information about sound level.
void OnSpeechSoundLevelChanged(int16_t level) override {}
void OnSpeechRecognitionStateChanged(
SpeechRecognizerStatus new_state) override;
void OnSpeechRecognitionStopped() override;
// ash::ProjectorAnnotatorController:
void SetTool(const ash::AnnotatorTool& tool) override;
void Undo() override;
void Redo() override;
void Clear() override;
// drive::DriveIntegrationServiceObserver:
void OnFileSystemMounted() override;
void OnFileSystemBeingUnmounted() override;
void OnFileSystemMountFailed() override;
// session_manager::SessionManagerObserver:
void OnUserProfileLoaded(const AccountId& account_id) override;
void OnUserSessionStarted(bool is_primary_user) override;
// user_manager::UserManager::UserSessionStateObserver:
void ActiveUserChanged(user_manager::User* active_user) override;
private:
// Maybe reset |drive_observation_| and observe the Drive integration service
// of active profile when ActiveUserChanged and OnUserProfileLoaded.
void MaybeSwitchDriveIntegrationServiceObservation();
// Called when any of the policies change that control whether the Projector
// app is enabled.
void OnEnablementPolicyChanged();
// Called when app registry becomes ready.
void SetAppIsDisabled(bool disabled);
ash::ProjectorController* const controller_;
SpeechRecognizerStatus recognizer_status_ =
SpeechRecognizerStatus::SPEECH_RECOGNIZER_OFF;
std::unique_ptr<OnDeviceSpeechRecognizer> speech_recognizer_;
// TODO(b/221492092): Clean this duplicate code with PendingScreencastManager.
// Create a new class to handle Drive related service.
base::ScopedObservation<session_manager::SessionManager,
session_manager::SessionManagerObserver>
session_observation_{this};
PrefChangeRegistrar pref_change_registrar_;
base::ScopedObservation<drive::DriveIntegrationService,
drive::DriveIntegrationServiceObserver>
drive_observation_{this};
base::ScopedObservation<
user_manager::UserManager,
user_manager::UserManager::UserSessionStateObserver,
&user_manager::UserManager::AddSessionStateObserver,
&user_manager::UserManager::RemoveSessionStateObserver>
session_state_observation_{this};
base::WeakPtrFactory<ProjectorClientImpl> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_UI_ASH_PROJECTOR_PROJECTOR_CLIENT_IMPL_H_