// 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.
#ifndef CHROME_BROWSER_ASH_SPARKY_SPARKY_MANAGER_IMPL_H_
#define CHROME_BROWSER_ASH_SPARKY_SPARKY_MANAGER_IMPL_H_
#include "ash/system/mahi/mahi_ui_controller.h"
#include "base/memory/raw_ptr.h"
#include "base/timer/timer.h"
#include "chrome/browser/profiles/profile.h"
#include "chromeos/components/mahi/public/cpp/mahi_manager.h"
#include "components/manta/mahi_provider.h"
#include "components/manta/manta_service.h"
#include "components/manta/sparky/sparky_provider.h"
#include "components/manta/sparky/sparky_util.h"
#include "ui/gfx/image/image_skia.h"
namespace gfx {
class Rect;
} // namespace gfx
namespace ash {
// The Mahi UI will be temporarily re-used for this feature which is an
// experimental prototype. For this reason, the SparkyManagerImpl derives from
// MahiManger, which contains the controls for the Mahi Ui.
class SparkyManagerImpl : public chromeos::MahiManager, public KeyedService {
public:
SparkyManagerImpl(Profile* profile, manta::MantaService* manta_service);
SparkyManagerImpl(const SparkyManagerImpl&) = delete;
SparkyManagerImpl& operator=(const SparkyManagerImpl&) = delete;
~SparkyManagerImpl() override;
// chromeos::MahiManager:
std::u16string GetContentTitle() override;
gfx::ImageSkia GetContentIcon() override;
GURL GetContentUrl() override;
void GetSummary(MahiSummaryCallback callback) override;
void GetOutlines(MahiOutlinesCallback callback) override;
void GoToOutlineContent(int outline_id) override;
void AnswerQuestionRepeating(
const std::u16string& question,
bool current_panel_content,
MahiAnswerQuestionCallbackRepeating callback) override;
void AnswerQuestion(const std::u16string& question,
bool current_panel_content,
MahiAnswerQuestionCallback callback) override;
void GetSuggestedQuestion(MahiGetSuggestedQuestionCallback callback) override;
void SetCurrentFocusedPageInfo(crosapi::mojom::MahiPageInfoPtr info) override;
void OnContextMenuClicked(
crosapi::mojom::MahiContextMenuRequestPtr context_menu_request) override;
void OpenFeedbackDialog() override;
void OpenMahiPanel(int64_t display_id,
const gfx::Rect& mahi_menu_bounds) override {}
bool IsEnabled() override;
void SetMediaAppPDFFocused() override;
bool AllowRepeatingAnswers() override;
// Notifies the panel that refresh is available or not for the corresponding
// surface.
void NotifyRefreshAvailability(bool available);
private:
friend class SparkyManagerImplTest;
friend class SparkyManagerImplFeatureKeyTest;
// Initialize required provider if it is not initialized yet.
void MaybeInitialize();
void OnGetPageContentForSummary(
MahiSummaryCallback callback,
crosapi::mojom::MahiPageContentPtr mahi_content_ptr);
void OnGetPageContentForQA(
const std::u16string& question,
MahiAnswerQuestionCallbackRepeating callback,
crosapi::mojom::MahiPageContentPtr mahi_content_ptr);
void OnSparkyProviderQAResponse(MahiAnswerQuestionCallbackRepeating callback,
manta::MantaStatus status,
manta::DialogTurn* latest_turn);
// There is a maximum limit of consecutive calls which can be made from the
// client with no additional request from the user. If the response from the
// server is trying to exceed this limit, there is a manual override and the
// last action for the latest turn will be set to done, so that no additional
// calls to the server are made.
void CheckTurnLimit();
void RequestProviderWithQuestion(
std::unique_ptr<manta::SparkyContext> sparky_context,
MahiAnswerQuestionCallbackRepeating callback);
crosapi::mojom::MahiPageInfoPtr current_page_info_ =
crosapi::mojom::MahiPageInfo::New();
crosapi::mojom::MahiPageContentPtr current_panel_content_ =
crosapi::mojom::MahiPageContent::New();
raw_ptr<Profile> profile_;
// Stores the dialog of the question and answers along with any associated
// actions.
std::vector<manta::DialogTurn> dialog_turns_;
std::unique_ptr<manta::SparkyProvider> sparky_provider_;
// Keeps track of the latest result and code, used for feedback.
std::u16string latest_summary_;
chromeos::MahiResponseStatus latest_response_status_;
MahiUiController ui_controller_;
// A timer is used to allow for a delay between when the actions are executed,
// and the additional call is made to the server to ensure that the actions
// have finished executing.
std::unique_ptr<base::OneShotTimer> timer_;
base::WeakPtrFactory<SparkyManagerImpl> weak_ptr_factory_{this};
};
} // namespace ash
#endif // CHROME_BROWSER_ASH_SPARKY_SPARKY_MANAGER_IMPL_H_