1 // Copyright 2018 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ash/assistant/model/assistant_ui_model.h"
6
7 #include "ash/assistant/model/assistant_ui_model_observer.h"
8
9 namespace ash {
10
11 AssistantUiModel::AssistantUiModel() = default;
12
13 AssistantUiModel::~AssistantUiModel() = default;
14
AddObserver(AssistantUiModelObserver * observer) const15 void AssistantUiModel::AddObserver(AssistantUiModelObserver* observer) const {
16 observers_.AddObserver(observer);
17 }
18
RemoveObserver(AssistantUiModelObserver * observer) const19 void AssistantUiModel::RemoveObserver(
20 AssistantUiModelObserver* observer) const {
21 observers_.RemoveObserver(observer);
22 }
23
SetUiMode(AssistantUiMode ui_mode,bool due_to_interaction)24 void AssistantUiModel::SetUiMode(AssistantUiMode ui_mode,
25 bool due_to_interaction) {
26 if (ui_mode == ui_mode_)
27 return;
28
29 ui_mode_ = ui_mode;
30 NotifyUiModeChanged(due_to_interaction);
31 }
32
SetVisible(AssistantEntryPoint entry_point)33 void AssistantUiModel::SetVisible(AssistantEntryPoint entry_point) {
34 SetVisibility(AssistantVisibility::kVisible, entry_point,
35 /*exit_point=*/base::nullopt);
36 }
37
SetClosed(AssistantExitPoint exit_point)38 void AssistantUiModel::SetClosed(AssistantExitPoint exit_point) {
39 SetVisibility(AssistantVisibility::kClosed,
40 /*entry_point=*/base::nullopt, exit_point);
41 }
42
SetUsableWorkArea(const gfx::Rect & usable_work_area)43 void AssistantUiModel::SetUsableWorkArea(const gfx::Rect& usable_work_area) {
44 if (usable_work_area == usable_work_area_)
45 return;
46
47 usable_work_area_ = usable_work_area;
48 NotifyUsableWorkAreaChanged();
49 }
50
SetVisibility(AssistantVisibility visibility,base::Optional<AssistantEntryPoint> entry_point,base::Optional<AssistantExitPoint> exit_point)51 void AssistantUiModel::SetVisibility(
52 AssistantVisibility visibility,
53 base::Optional<AssistantEntryPoint> entry_point,
54 base::Optional<AssistantExitPoint> exit_point) {
55 if (visibility == visibility_)
56 return;
57
58 const AssistantVisibility old_visibility = visibility_;
59 visibility_ = visibility;
60
61 if (visibility == AssistantVisibility::kVisible) {
62 // Cache the Assistant entry point used for query count UMA metric.
63 DCHECK(entry_point.has_value());
64 DCHECK(!exit_point.has_value());
65 entry_point_ = entry_point.value();
66 } else {
67 DCHECK(!entry_point.has_value());
68 DCHECK(exit_point.has_value());
69 }
70
71 NotifyUiVisibilityChanged(old_visibility, entry_point, exit_point);
72 }
73
NotifyUiModeChanged(bool due_to_interaction)74 void AssistantUiModel::NotifyUiModeChanged(bool due_to_interaction) {
75 for (AssistantUiModelObserver& observer : observers_)
76 observer.OnUiModeChanged(ui_mode_, due_to_interaction);
77 }
78
NotifyUiVisibilityChanged(AssistantVisibility old_visibility,base::Optional<AssistantEntryPoint> entry_point,base::Optional<AssistantExitPoint> exit_point)79 void AssistantUiModel::NotifyUiVisibilityChanged(
80 AssistantVisibility old_visibility,
81 base::Optional<AssistantEntryPoint> entry_point,
82 base::Optional<AssistantExitPoint> exit_point) {
83 for (AssistantUiModelObserver& observer : observers_)
84 observer.OnUiVisibilityChanged(visibility_, old_visibility, entry_point,
85 exit_point);
86 }
87
NotifyUsableWorkAreaChanged()88 void AssistantUiModel::NotifyUsableWorkAreaChanged() {
89 for (AssistantUiModelObserver& observer : observers_)
90 observer.OnUsableWorkAreaChanged(usable_work_area_);
91 }
92
93 } // namespace ash
94