#ifndef CHROMEOS_COMPONENTS_QUICK_ANSWERS_QUICK_ANSWERS_CLIENT_H_
#define CHROMEOS_COMPONENTS_QUICK_ANSWERS_QUICK_ANSWERS_CLIENT_H_
#include <memory>
#include <string>
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "chromeos/components/quick_answers/result_loader.h"
#include "chromeos/components/quick_answers/understanding/intent_generator.h"
namespace network {
class SharedURLLoaderFactory;
}
namespace quick_answers {
class SpellChecker;
struct QuickAnswersRequest;
struct IntentInfo;
enum class IntentType;
enum class ResultType;
class QuickAnswersDelegate {
public:
QuickAnswersDelegate(const QuickAnswersDelegate&) = delete;
QuickAnswersDelegate& operator=(const QuickAnswersDelegate&) = delete;
virtual void OnQuickAnswerReceived(
std::unique_ptr<QuickAnswersSession> quick_answers_session) {}
virtual void OnRequestPreprocessFinished(
const QuickAnswersRequest& processed_request) {}
virtual void OnNetworkError() {}
protected:
QuickAnswersDelegate() = default;
virtual ~QuickAnswersDelegate() = default;
};
class QuickAnswersClient : public ResultLoader::ResultLoaderDelegate {
public:
using ResultLoaderFactoryCallback =
base::RepeatingCallback<std::unique_ptr<ResultLoader>()>;
using IntentGeneratorFactoryCallback =
base::RepeatingCallback<std::unique_ptr<IntentGenerator>()>;
QuickAnswersClient(
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
QuickAnswersDelegate* delegate);
QuickAnswersClient(const QuickAnswersClient&) = delete;
QuickAnswersClient& operator=(const QuickAnswersClient&) = delete;
~QuickAnswersClient() override;
void OnNetworkError() override;
void OnQuickAnswerReceived(
std::unique_ptr<QuickAnswersSession> quick_answers_session) override;
virtual void SendRequestForPreprocessing(
const QuickAnswersRequest& quick_answers_request);
void FetchQuickAnswers(const QuickAnswersRequest& processed_request);
virtual void SendRequest(const QuickAnswersRequest& quick_answers_request);
virtual void OnQuickAnswerClick(ResultType result_type);
virtual void OnQuickAnswersDismissed(ResultType result_type, bool is_active);
static void SetResultLoaderFactoryForTesting(
ResultLoaderFactoryCallback* factory);
static void SetIntentGeneratorFactoryForTesting(
IntentGeneratorFactoryCallback* factory);
private:
FRIEND_TEST_ALL_PREFIXES(QuickAnswersClientTest, SendRequest);
FRIEND_TEST_ALL_PREFIXES(QuickAnswersClientTest,
NotSendRequestForUnknownIntent);
FRIEND_TEST_ALL_PREFIXES(QuickAnswersClientTest, PreprocessDefinitionIntent);
FRIEND_TEST_ALL_PREFIXES(QuickAnswersClientTest, PreprocessTranslationIntent);
FRIEND_TEST_ALL_PREFIXES(QuickAnswersClientTest,
PreprocessUnitConversionIntent);
std::unique_ptr<ResultLoader> CreateResultLoader(IntentType intent_type);
std::unique_ptr<IntentGenerator> CreateIntentGenerator(
const QuickAnswersRequest& request,
bool skip_fetch);
void SendRequestInternal(const QuickAnswersRequest& quick_answers_request,
bool skip_fetch);
void IntentGeneratorCallback(const QuickAnswersRequest& quick_answers_request,
bool skip_fetch,
const IntentInfo& intent_info);
base::TimeDelta GetImpressionDuration() const;
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
raw_ptr<QuickAnswersDelegate> delegate_ = nullptr;
std::unique_ptr<SpellChecker> spell_checker_;
std::unique_ptr<ResultLoader> result_loader_;
std::unique_ptr<IntentGenerator> intent_generator_;
base::TimeTicks quick_answer_received_time_;
base::WeakPtrFactory<QuickAnswersClient> weak_factory_{this};
};
}
#endif