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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_ASSISTANT_MODEL_ASSISTANT_INTERACTION_MODEL_H_
#define ASH_ASSISTANT_MODEL_ASSISTANT_INTERACTION_MODEL_H_
#include <memory>
#include <string>
#include <vector>
#include "ash/assistant/model/assistant_query_history.h"
#include "base/component_export.h"
#include "base/memory/scoped_refptr.h"
#include "base/observer_list.h"
namespace ash {
class AssistantInteractionModelObserver;
class AssistantQuery;
class AssistantResponse;
// Enumeration of interaction input modalities.
enum class InputModality {
kKeyboard,
kVoice,
};
// TODO(dmblack): This is an oversimplification. We will eventually want to
// distinctly represent listening/thinking/etc. states explicitly so they can
// be adequately represented in the UI.
// Enumeration of interaction states.
enum class InteractionState {
kActive,
kInactive,
};
// Enumeration of interaction mic states.
enum class MicState {
kClosed,
kOpen,
};
// Models the Assistant interaction. This includes query state, state of speech
// recognition, as well as a renderable AssistantResponse.
class COMPONENT_EXPORT(ASSISTANT_MODEL) AssistantInteractionModel {
public:
AssistantInteractionModel();
AssistantInteractionModel(const AssistantInteractionModel&) = delete;
AssistantInteractionModel& operator=(const AssistantInteractionModel&) =
delete;
~AssistantInteractionModel();
// Adds/removes the specified interaction model |observer|.
void AddObserver(AssistantInteractionModelObserver* observer) const;
void RemoveObserver(AssistantInteractionModelObserver* observer) const;
// Resets the interaction to its initial state.
void ClearInteraction();
// Resets the interaction to its initial state. There are instances in which
// we wish to clear the interaction but retain the committed query. Similarly,
// there are instances in which we wish to retain the pending response that is
// currently cached. For such instances, use |retain_committed_query| and
// |retain_pending_response| respectively.
void ClearInteraction(bool retain_committed_query,
bool retain_pending_response);
// Sets the interaction state.
void SetInteractionState(InteractionState interaction_state);
// Returns the interaction state.
InteractionState interaction_state() const { return interaction_state_; }
// Updates the input modality for the interaction.
void SetInputModality(InputModality input_modality);
// Returns the input modality for the interaction.
InputModality input_modality() const { return input_modality_; }
// Updates the mic state for the interaction.
void SetMicState(MicState mic_state);
// Returns the mic state for the interaction.
MicState mic_state() const { return mic_state_; }
// Returns the committed query for the interaction.
const AssistantQuery& committed_query() const { return *committed_query_; }
// Clears the committed query for the interaction.
void ClearCommittedQuery();
// Updates the pending query for the interaction.
void SetPendingQuery(std::unique_ptr<AssistantQuery> pending_query);
// Returns the pending query for the interaction.
const AssistantQuery& pending_query() const { return *pending_query_; }
// Commits the pending query for the interaction.
void CommitPendingQuery();
// Clears the pending query for the interaction.
void ClearPendingQuery();
// Sets the pending response for the interaction.
void SetPendingResponse(scoped_refptr<AssistantResponse> response);
// Returns the pending response for the interaction.
AssistantResponse* pending_response() { return pending_response_.get(); }
// Commits the pending response for the interaction. Note that this will cause
// the previously committed response, if one exists, to be animated off stage
// after which the newly committed response will begin rendering.
void CommitPendingResponse();
// Clears the pending response for the interaction.
void ClearPendingResponse();
// Returns the committed response for the interaction.
AssistantResponse* response() { return response_.get(); }
const AssistantResponse* response() const { return response_.get(); }
// Clears the committed response for the interaction.
void ClearResponse();
// Updates the speech level in dB.
void SetSpeechLevel(float speech_level_db);
// Returns the reference to query history.
AssistantQueryHistory& query_history() { return query_history_; }
// Returns the const reference to query history.
const AssistantQueryHistory& query_history() const { return query_history_; }
private:
void NotifyInteractionStateChanged();
void NotifyInputModalityChanged();
void NotifyMicStateChanged();
void NotifyCommittedQueryChanged();
void NotifyCommittedQueryCleared();
void NotifyPendingQueryChanged();
void NotifyPendingQueryCleared(bool due_to_commit);
void NotifyResponseChanged();
void NotifyResponseCleared();
void NotifySpeechLevelChanged(float speech_level_db);
InteractionState interaction_state_ = InteractionState::kInactive;
InputModality input_modality_ = InputModality::kKeyboard;
MicState mic_state_ = MicState::kClosed;
AssistantQueryHistory query_history_;
std::unique_ptr<AssistantQuery> committed_query_;
std::unique_ptr<AssistantQuery> pending_query_;
scoped_refptr<AssistantResponse> pending_response_;
scoped_refptr<AssistantResponse> response_;
mutable base::ObserverList<AssistantInteractionModelObserver> observers_;
};
} // namespace ash
#endif // ASH_ASSISTANT_MODEL_ASSISTANT_INTERACTION_MODEL_H_
|