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