| // Copyright 2017 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_ |
| #define PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_ |
| |
| #include <map> |
| #include <set> |
| |
| #include <fuchsia/maxwell/internal/cpp/fidl.h> |
| #include <fuchsia/modular/cpp/fidl.h> |
| #include <lib/app_driver/cpp/agent_driver.h> |
| #include <lib/fidl/cpp/binding.h> |
| #include <lib/fxl/macros.h> |
| #include <lib/svc/cpp/service_namespace.h> |
| |
| namespace maxwell { |
| |
| class StoryWatcherImpl; |
| |
| // This class pulls info about Stories from Framework and stores it in |
| // the Context service. |
| // |
| // It maintains a hierarchy of context values to represent: |
| // Stories -> Modules |
| // -> Link Entities |
| // |
| // TODO(thatguy): Add Link value types to the Context engine and use them |
| // here. Then update the resulting published value to remove its added JSON |
| // structure, since it will all be represented in the metadata of the value. |
| class StoryInfoAcquirer : public fuchsia::modular::VisibleStoriesWatcher, |
| public fuchsia::modular::StoryProviderWatcher, |
| public fuchsia::modular::FocusWatcher { |
| public: |
| StoryInfoAcquirer(modular::AgentHost* agent_host); |
| ~StoryInfoAcquirer() override; |
| |
| // Called by AgentDriver. |
| void Connect(fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> services); |
| |
| // Called by AgentDriver. |
| void RunTask(const fidl::StringPtr& task_id, |
| const fuchsia::modular::Agent::RunTaskCallback& callback); |
| |
| // Called by AgentDriver. |
| void Terminate(const std::function<void()>& done); |
| |
| // Used by StoryWatcherImpl. |
| void DropStoryWatcher(const std::string& story_id); |
| |
| private: |
| // |fuchsia::modular::FocusWatcher| |
| void OnFocusChange(fuchsia::modular::FocusInfoPtr info) override; |
| |
| // |fuchsia::modular::VisibleStoriesWatcher| |
| void OnVisibleStoriesChange(fidl::VectorPtr<std::string> ids) override; |
| |
| // |fuchsia::modular::StoryProviderWatcher| |
| void OnChange( |
| fuchsia::modular::StoryInfo info, fuchsia::modular::StoryState state, |
| fuchsia::modular::StoryVisibilityState visibility_state) override; |
| void OnDelete(std::string story_id) override; |
| |
| fuchsia::modular::ContextWriterPtr context_writer_; |
| fuchsia::modular::ContextReaderPtr context_reader_; |
| fuchsia::modular::StoryProviderPtr story_provider_; |
| fuchsia::modular::FocusProviderPtr focus_provider_; |
| fuchsia::modular::VisibleStoriesProviderPtr visible_stories_provider_; |
| |
| fidl::Binding<fuchsia::modular::VisibleStoriesWatcher> |
| visible_stories_watcher_binding_; |
| fidl::Binding<fuchsia::modular::StoryProviderWatcher> |
| story_provider_watcher_binding_; |
| fidl::Binding<fuchsia::modular::FocusWatcher> focus_watcher_binding_; |
| |
| // Local state. |
| // story id -> context value id |
| std::map<fidl::StringPtr, fidl::StringPtr> story_value_ids_; |
| fidl::StringPtr focused_story_id_; |
| std::set<fidl::StringPtr> visible_story_ids_; |
| |
| // A collection of all active stories we watch. Keys are story IDs, Values are |
| // the fuchsia::modular::StoryWatcher instances. |
| std::map<std::string, std::unique_ptr<StoryWatcherImpl>> stories_; |
| |
| component::ServiceNamespace agent_services_; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(StoryInfoAcquirer); |
| }; |
| |
| } // namespace maxwell |
| |
| #endif // PERIDOT_BIN_ACQUIRERS_STORY_INFO_STORY_INFO_H_ |